JPA CriteriaBuilder值就像列一样

时间:2017-02-14 15:38:46

标签: java jpa eclipselink criteria-api

我正在尝试使用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是否与该记录匹配。

2 个答案:

答案 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();

这个有效!谢谢克里斯!