【发布时间】: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