2012-04-17 44 views
0

使用UPPER我有一个类标准API - 在ElementCollection

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

我想使用JPA 2.0标准API搜索过这些标签 - 但在一个不区分大小写的方式。因此,我希望将搜索参数设置为UPPER,并将列设置为UPPER(伪SQL:从Person p连接标记中选择p。* t p.id = t.pId其中upper(t.name)= upper(' searchParameter');)

这里是不上我的代码的标签:

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“Column”?

换句话说,我希望写这个查询与标准API:

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

谢谢

回答

0

你需要调用从人加入标签上文字属性名称。

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。

如果我在某个地方有问题,请编辑我的答案给更多的用户。

希望这会有所帮助。

+0

这是行不通的。我没有“标签”类,我只有一组字符串。此外,isMember方法需要“Expression > paramExpression1”,builder.upper返回表达式。 – Soccertrash 2012-04-17 13:56:26

+0

有趣的情况。除了在getter上使用属性访问,我想不出任何其他方式,但它会是hacky。 – JMelnik 2012-04-17 15:22:25

+1

我刚刚将解决方案作为评论添加到了我的问题中 – Soccertrash 2012-04-17 15:39:49

1

好的,我终于有溶液:

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

人们必须使用 “如(..)” 的方法。

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