2012-04-17 55 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())));