我正试图用标准生成器对我的实体进行通用搜索,其中给定的文本与实体中的所有列相匹配。
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
方法出了什么问题。任何形式的帮助都将不胜感激!
我在进行一些测试时遇到了类似的问题,并且在类路径中有相同(简单(名称的实体。例如,有这样的实体:
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);