对 varchar 列使用 Hibernate 数字限制

using Hibernate numeric restriction for a varchar column

我正在使用 Hibernate Criteria 来动态构建查询。 这些动态查询之一使用存储在 MySQL 上的列作为 varchar。但是,是一个存储项目价格的列(只有带小数的数值)。所以我想使用 ge lebetween.

生成查询

有没有办法让"hey, this column is of type varchar, but its content is numeric so apply my numeric restrictions (please)"之类的东西进入休眠状态?

您的 Hibernate 查询被翻译成 SQL。如果基础列是 varchar 列,我不确定 Hibernate 是否可以对此做任何事情。

由于问题出在数据库层,因此一个建议是在数据库中创建一个虚拟列(如果您的数据库支持此类操作)并将此 varchar 转换为 decimal 。

Quick Google for MySql 建议:

http://mysqlserverteam.com/generated-columns-in-mysql-5-7-5/

然后您可以将实体中的价格字段作为数字类型映射到此虚拟列,并根据需要进行查询。

如果做不到这一点,您可以创建一个 2 列视图(id、价格)来做类似的事情,并将价格字段映射到您现有的实体作为辅助 table。

更新

进一步检查后,我注意到 MySQL 文档中的以下内容:

http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html

Strings are automatically converted to numbers... as necessary.

因此,您似乎可以执行以下操作。使用类型转换器 (JPA 2.1) 在域模型中的 String <> Numeric 类型之间进行转换。鉴于以上情况,只需使用标准数字运算符针对此字段编写查询即可。

http://www.thoughts-on-java.org/jpa-21-how-to-implement-type-converter/

我也出现了同样的问题。我的解决办法是,我新建了一个Product的变量,数据类型是double。并使用此元素的休眠公式,然后将 gelebetween 应用于此新变量。我的 pojo 看起来像这样:

@Column
private String price;

@Formula(value="to_number(price)")
private double newDouble;

我的休眠标准如下所示:

Criteria criteria = session.createCriteria(Product.class);
criteria.add(Restrictions.between("newDouble",252.50,300));
List<Product> products = session.list();

希望对您有所帮助。