【问题标题】:JPA search query using Criteria Builder for multiple columns使用 Criteria Builder 对多列进行 JPA 搜索查询
【发布时间】:2021-01-20 22:27:35
【问题描述】:

我正在尝试使用标准构建器对我的实体进行通用搜索,其中给定文本与实体中的所有列匹配。

String likeSearchText = "%" + searchText + "%";
List<Customer> searchedCustomers = null;
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery query = builder.createQuery(Customer.class);
Root <Customer> root = query.from(Customer.class);
ArrayList<Predicate> conditions = new ArrayList<>();
conditions.add(builder.like(root.<String>get("firstName"), likeSearchText));
conditions.add(builder.like(root.<String>get("lastName"), likeSearchText));
conditions.add(builder.like(root.<String>get("middleName"), likeSearchText));
conditions.add(builder.like(root.<String>get("companyName"), likeSearchText));
conditions.add(builder.like(root.<String>get("industry"), likeSearchText));
query.where(builder.or(conditions.toArray(new Predicate[conditions.size()])));
query.select(root);
searchedCustomers = entityManager.createQuery(query).getResultList();
return searchedCustomers;

当我运行这个方法时,我总是得到一个空列表。我尝试将like 更改为notLike,并且通过给我一个包含与给定搜索文本不同的元素的列表,效果非常好,所以我真的很困惑我的like 方法有什么问题。 任何形式的帮助将不胜感激!

【问题讨论】:

  • 实际上我的回答可能不是很有帮助,但是您是否检查过字母大小写是否相同,例如?尝试使用 to lowerCase() 左右?
  • 我看不出有什么问题。所以我建议打开 sql logging 并查看生成的 Statements。如果您使用的是 eclipseLink,这可以通过 persistence.xml 中的条目来完成:
  • @pirho 是的,传递给此方法的字符串参数已经小写了。
  • @frank 谢谢!我会试试看。

标签: jpa ejb jpql java-ee-6 criteriaquery


【解决方案1】:

当我进行一些测试并且在类路径中有具有相同(简单)名称的实体时,我遇到了类似的问题。例如,有这样的实体:

org.example.one.Customer
org.example.two.Customer

如果您没有明确设置不同的表名,例如:

package org.example.one;
@Entity("customer_one")
public class Customer { ...

package org.example.two;
@Entity("customer_two")
public class Customer { ...

休眠可能:

  • 在 db 的同一张表中混合内容
  • 构造查询时尝试从错误的表中查找字段

我也认为你不需要这个:

query.select(root);

【讨论】:

  • 我确实有另一个同名的类,但两个类的包不同,另一个类甚至不是实体。只有一个客户类是实体类型。 hibernate 还会混合这两个类吗?
  • 根据我的经验,如果存在两个实体指向同一个数据库表的情况,则该包无关紧要。但我认为 Hibernate 不可能混合实体和非实体,因为非实体不指向 db 表。但不能确定。
猜你喜欢
  • 1970-01-01
  • 2017-07-20
  • 2011-03-14
  • 2012-12-19
  • 2023-01-02
  • 1970-01-01
  • 2018-04-08
  • 2011-01-11
相关资源
最近更新 更多