使用Criteria Builder对多列进行JPA搜索查询

问题描述

我正在尝试使用条件生成器对我的实体进行通用搜索,其中给定的文本与实体中的所有列都匹配。

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,并通过给我一个包含与给定搜索文本不同的元素的列表,使其工作起来非常正常,因此我对{{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 { ...

休眠可能:

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

我也想你不需要这个:

query.select(root);