我开发了我的项目Web应用程序,我想更改搜索配置文件功能以使用JPA Criteria。我的想法是省略这些搜索条件,html格式的哪些字段留空。困难的部分是用字符串列表中的兴趣编写谓词。
public List<Profile> searchProfiles(String sex, String city, List<String> interests) {
List<String> emptyInterests = new ArrayList<>(); emptyInterests.add("");
Session session = this.sessionFactory.getCurrentSession();
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Profile> criteriaQuery = builder.createQuery(Profile.class);
Root<Profile> root = criteriaQuery.from(Profile.class);
List<Predicate> predicates = new ArrayList<>();
if(!"".equals(sex)) {
predicates.add(builder.equal(root.get("sex"), sex ));
}
if(!"".equals(city)) {
predicates.add(builder.equal(root.get("city"), city ));
}
if(!emptyInterests.equals(interests)) {
// REASON OF ASKING THIS QUESTION
}
criteriaQuery.select(root).where(predicates.toArray(new Predicate[]{}));
return session.createQuery(criteriaQuery).list();
}
在最后&#34;如果&#34;块我想添加谓词,这意味着或多或少&#34;如果其兴趣点的字符串列表(配置文件类字段)包含来自方法参数&#34;兴趣&#34;的所有元素,则将配置文件添加到结果列表。 &#34 ;.在正常列表中过滤它的条件如下:
for(Profile profile : profiles) {
if(profile.getInterests().contains(interests))
results.add(profile);
}
编辑:
以下代码导致ClassCastException:java.base / java.lang.String无法在返回行中强制转换为java.base / java.util.List。
if(!emptyInterests.equals(interests))
{
Expression<String> interestsExpression = root.get("interests");
Predicate interestsPredicate = interestsExpression.in(interests);
predicates.add(interestsPredicate);
}