Java 对varchar列使用Hibernate数值限制

Java 对varchar列使用Hibernate数值限制,java,mysql,hibernate,criteria,Java,Mysql,Hibernate,Criteria,我使用Hibernate标准来动态构建查询。 其中一个动态查询使用存储在MySQL上的列作为varchar。但是,是存储项目价格的列(只有带小数的数值)。因此,我想使用gele或之间的生成查询 有没有一种方法可以告诉休眠类似“嘿,这个列是varchar类型的,但是它的内容是数字的,所以应用我的数字限制(请)” 您将休眠查询转换为SQL。如果基础列是一个varchar列,我不确定Hibernate是否可以对此做任何事情 由于问题是在数据库层,因此建议在数据库中创建一个虚拟列(如果您的数据库支持此类

我使用Hibernate标准来动态构建查询。 其中一个动态查询使用存储在MySQL上的列作为varchar。但是,是存储项目价格的列(只有带小数的数值)。因此,我想使用
ge
le
之间的
生成查询


有没有一种方法可以告诉休眠类似“嘿,这个列是varchar类型的,但是它的内容是数字的,所以应用我的数字限制(请)”

您将休眠查询转换为SQL。如果基础列是一个varchar列,我不确定Hibernate是否可以对此做任何事情

由于问题是在数据库层,因此建议在数据库中创建一个虚拟列(如果您的数据库支持此类内容),并将此varchar转换为十进制

Quick Google for MySql建议:

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

如果做不到这一点,您可以创建一个2列视图(id,price)来执行类似的操作,并将price字段作为辅助表映射到现有实体

更新 在进一步检查之后,我从MySQL文档中注意到以下内容:

字符串将自动转换为数字。。。必要时

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


同样的问题也发生在我身上。我的解决方案是,我创建了一个新变量
Product
,数据类型是
double
。使用hibernate公式计算这个元素,然后我将
ge
le
between
应用于这个新变量。我的pojo看起来像这样:

@Column
private String price;

@Formula(value="to_number(price)")
private double newDouble;
我的hibernate标准如下所示:

Criteria criteria = session.createCriteria(Product.class);
criteria.add(Restrictions.between("newDouble",252.50,300));
List<Product> products = session.list();
Criteria=session.createCriteria(Product.class);
标准。添加(限制。介于(“newDouble”,252.50300)之间);
列表产品=session.List();

我希望这会对您有所帮助。

您不能更改表的数据类型吗?此表正在生产中,我不知道是否会损坏某些内容。我不知道,也许有一个很好的理由把价格作为一个瓦查尔储存起来。无论如何,更改数据类型现在不是一个选项。那么,您应该在hibernate中将其声明为字符串,并在java中进行解析