我正在使用遗留数据库并使用Spring数据JPA进行存储库访问。其中一个表具有数字数据类型的id列,但要求是能够使用通配符执行部分匹配。所以12应该匹配1234.如果我正在编写本机查询,我可以做
select * from table where id like 12%
但是当使用提供类型安全性的Spring JPA Criteria API时,我必须先进行类型转换才能使用like运算符
cb.like(root.get(SomeEntity_.id).as(String.class), str + "%")
请注意,我必须添加 .as(String.class)才能使用like
运算符执行字符串匹配。这导致数据类型转换,并且查询无法从id索引
cast(table0_1_.id as varchar(255)) like ?
有没有办法为这个基于数字的列执行类似匹配而无需执行类型转换?
答案 0 :(得分:0)
我只想指出对数字数据类型应用LIKE
操作可能会产生不可预测的结果,请参阅Reference以获取SQL Server警告。
要记住的另一件事是,有时数据库在数据类型不同或特定操作意味着特定数据类型要求时执行值的就地强制。
所以即使你写id LIKE 12%
,你有什么证据表明内部没有被强迫CAST(id as VARCHAR(255)) LIKE '12%'
?
但是要专门回答您的问题,JPA CriteriaBuilder
类没有明确显示当您希望使用like()
操作时,Expression 必须属于{{1 }} 数据类型。所以你要么必须在你的帖子中说明它,要么确保列已经是所说的类型。