Criteria API - 在ElementCollection中使用UPPER

时间:2012-04-17 13:21:18

标签: api jpa criteria

我有一个班级

@Entity
public class Person{
...
@ElementCollection
private Set<String> tags;
...
}

我想使用JPA 2.0 Criteria API来搜索这些标记 - 但是以不区分大小写的方式。因此,我想将搜索参数设置为UPPER,将列设置为UPPER(Pseudo-SQL:选择p。*来自Person p连接标签t on p.id = t.pId where upper(t.name)= upper(' searchParameter');)

以下是代码中没有UPPER的代码:

  CriteriaBuilder builder = this.em.getCriteriaBuilder();
  CriteriaQuery<Person> query = builder.createQuery(Person.class);
  Root<Person> root = query.from(Person.class);

  return this.em.createQuery(query.select(root).where(
     builder.isMember(builder.upper(builder.literal(searchTag)),
        root.get(Person_.tags)))).getResultList();

其中searchTag是输入参数。

如何将UPPER分配给Person_.tags“列”?

换句话说,我想用Criteria API编写这个Query:

SELECT p FROM Person p JOIN p.tags t WHERE UPPER(t) = UPPER('searchString')

谢谢

3 个答案:

答案 0 :(得分:1)

好的,我终于有了解决方案:

  cQuery.where(
     builder.equal(
        builder.upper(cQuery.from(Relation.class).join(Relation_.aliase)
           .as(String.class)),
        builder.upper(builder.literal(alias))
        )
     );

必须使用“.as(..)”方法。

答案 1 :(得分:1)

suburbCriteria = criteriaBuilder.equal( 
                    criteriaBuilder.upper(root.get(Property_.suburb)), 
                    criteriaBuilder.upper(criteriaBuilder.literal(searchBean.getSuburb())));

答案 2 :(得分:0)

您需要在Person的连接标签上调用upper和literal属性名称。

CriteriaBuilder builder = this.em.getCriteriaBuilder();
CriteriaQuery<Person> query = builder.createQuery(Person.class);
Root<Person> root = query.from(Person.class);
Join<Person, Tag> tags = root.join(Person_.tags);

query.where(builder.isMember(
        builder.upper(builder.literal(searchTag)), 
        builder.upper(builder.literal(tags.get(Tag_.name)))
));

return this.em.createQuery(query).getResultList();

我省略query.select(root),不确定是否需要。 Tou也可以在Tag_.name上省略builder.literal(),因为它是String。

如果我在某处错了,请为其他用户编辑我的答案。

希望这有帮助。