2012-04-17 6 views
0

私はこれらのタグを検索するJPA 2.0クライテリアAPIを使用したいクラスクライテリアAPI - UPPERを使用してElementCollection

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

を持っている - しかし、大文字小文字を区別しない方法インチこのように、検索パラメータをUPPERに、カラムをUPPERに設定したい(Pseudo-SQL:Person pのselect p。*からp.id = t.pId上のタグtを選択する)upper(t.name)= upper( ' searchParameter ');ここで)

は、タグのUPPERせずに私のコードです:

searchTagは、入力パラメータである
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(); 

Person_.tags「列」にどのようにUPPERを割り当てることができますか?

言い換えれば、私は基準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)は必須ではありません。 Tag_.nameのbuilder.literal()はStringであるため、省略することもできます。

私がどこか間違っている場合は、他のユーザーのために自分の回答を編集してください。

これが役に立ちます。

+0

これは機能しません。私はクラス "タグ"を持っていない、私は唯一の文字列のセットを持っています。さらに、isMemberメソッドは "Expression > paramExpression1"を予期し、builder.upperは式を返します。 – Soccertrash

+0

興味深い状況。ゲッターでプロパティアクセスを使う以外の方法は考えられませんが、それはハッキリです。 – JMelnik

+1

私はちょうどコメントとして私の質問にソリューションを追加しました – Soccertrash

1

[OK]を、私は最終的に解決策を持っている:

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

一つは "の.as(..)" メソッドを使用する必要があります。

1
suburbCriteria = criteriaBuilder.equal( 
        criteriaBuilder.upper(root.get(Property_.suburb)), 
        criteriaBuilder.upper(criteriaBuilder.literal(searchBean.getSuburb()))); 
関連する問題