3

我有一堂课

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

我想使用 JPA 2.0 Criteria API 来搜索这些标签——但不区分大小写。因此,我想将搜索参数设置为 UPPER 并将列设置为 UPPER (伪 SQL:select p.* from Person p join Tags t on p.id=t.pId where upper(t.name)=upper('搜索参数');)

这是我在标签上没有 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 编写这个查询:

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

谢谢

4

3 回答 3

2

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

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

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

于 2012-04-19T09:17:38.583 回答
1
suburbCriteria = criteriaBuilder.equal( 
                    criteriaBuilder.upper(root.get(Property_.suburb)), 
                    criteriaBuilder.upper(criteriaBuilder.literal(searchBean.getSuburb())));
于 2012-07-26T00:45:56.800 回答
0

您需要从 Person 调用连接标签上的上部和文字属性名称。

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。

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

希望这可以帮助。

于 2012-04-17T13:44:08.443 回答