【问题标题】:JPA CriteriaBuilder value like columnJPA CriteriaBuilder 值类似于列
【发布时间】:2017-07-02 23:38:13
【问题描述】:

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

【问题讨论】:

  • 也许您忘记在测试字符串的开头和结尾添加“%”?
  • 您有任何错误吗?或者它只是不起作用..
  • 它只是无法编译。 JPA 不喜欢这样做 ;)
  • 显示它抱怨的内容。您也可以先尝试 JPQL 来验证它是否可以在那里工作。如果它不喜欢该字符串,请尝试将其作为参数传入 cb.where(cb.like(cb.parameter(String.class, "myValueParameter"), root.get(Entity_.email)); 然后在查询中设置参数 query.setParameter("myValueParameter", myValue);

标签: java jpa eclipselink criteria-api


【解决方案1】:

我认为你的参数应该反过来:

cb.where(cb.like(root.get(Entity_.email),myValue);

另外,您可能需要使用将其添加到第二个参数:

cb.where(cb.like(root.get(Entity_.email),"%"+myValue+"%");

【讨论】:

  • 我需要它们按这个顺序排列。我需要检查给定的电子邮件地址是否与数据库中的通配符条目匹配。
  • 发现类似的问题可能会有所帮助。 stackoverflow.com/q/30718445/3136973
  • 这只是一个如何实现WHERE columnValue LIKE myTestValue的例子,反之亦然WHERE myTestValue LIKE columnValue
  • 我明白了,我稍后会尝试在一些实际环境中进行一些测试。您使用的是 JPA 2.1 吗?还有 EclispeLink 版本?
  • 这不是问题的答案。这是针对列类值的。
【解决方案2】:

克里斯找到了答案。首先我需要“生成”一个参数。

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

这行得通!谢谢克里斯!

【讨论】:

  • 这对我来说适用于 JPA、hibernate 和 spring boot 2.1.9,谢谢!
猜你喜欢
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-22
  • 1970-01-01
  • 2019-04-10
  • 1970-01-01
  • 2017-03-15
相关资源
最近更新 更多