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