我正在尝试使用CriteriaBuilder创建一个查询,我需要有一个谓词,其中谓词的值就像数据库中的值。
基本上,我需要能够做到以下几点:
WHERE myTestValue LIKE columnValue
在本机查询中,可以选择这样做,但是使用CriteriaBuilder或NamedQueries,它似乎不起作用。
String myValue = "foo@bar.com";
cb.where(cb.like(myValue, root.get(Entity_.email));
JPA中有一个选项可以这样做吗?或者我应该回归本地查询?
修改
我需要能够检查给定值是否与数据库中的通配符条目匹配。所以数据库有一个记录%@bar.com%
,我需要检查我的给定值foo@bar.com
是否与该记录匹配。
答案 0 :(得分:4)
我认为你的参数应该是另一回事:
cb.where(cb.like(root.get(Entity_.email),myValue);
您可能需要将此添加到第二个参数:
cb.where(cb.like(root.get(Entity_.email),"%"+myValue+"%");
答案 1 :(得分:1)
ParameterExpression<String> senderEmailParameter = cb.parameter(String.class, "senderEmailParameter");
Path<String> senderEmailPath = root.get(Entity_.senderEmail);
Predicate predEmail = cb.like(senderEmailParameter, senderEmailPath);
然后我需要在查询中填充参数。
q.where(predEmail);
return em.createQuery(q).setParameter("senderEmailParameter", senderEmail).getSingleResult();
这个有效!谢谢克里斯!