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(' 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 を使用してこのクエリを書きたいと考えています。

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 は String であるため、Tag_.name の builder.literal() を省略することもできます。

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

お役に立てれば。

于 2012-04-17T13:44:08.443 に答える