我有一个班级
@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')
谢谢
答案 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。
如果我在某处错了,请为其他用户编辑我的答案。
希望这有帮助。