web-dev-qa-db-ja.com

Likeおよび%%演算子を使用するHibernate名前付きクエリ?

Hibernate JPAサンプルコードで..

public List<AttendeesVO> addAttendees(String searchKeyword) {
    TypedQuery<AttendeesVO> query = entityManager.createQuery(" select at from AttendeesVO at where at.user.firstName LIKE :searchKeyword",AttendeesVO.class);
    query.setParameter("searchKeyword", searchKeyword+"%");
    return query.getResultList();
}

string firstName=Narasimham

しかし、Narasimhamの任意の文字、つまりaまたはnを指定すると機能しません。

実際、私の考えは、Like演算子に% %したがって、指定された文字列の任意の文字が機能します。

33
Java Developer

あなたはquery.setParameter("searchKeyword", searchKeyword+"%");を使用しています

query.setParameter("searchKeyword", "%"+searchKeyword+"%");の代わりに

最初はNarasimhamNNaNarNaraなどの行を返します。

53
ssk

しかし、ナラシンハムのキャラクターを与えると、それは機能しません

大文字と小文字を区別して検索しているためです。代わりにNNaNarを試してください。大文字と小文字を区別しない検索を実行する場合は、upperまたはlowerを使用してみてください。のような

entityManager.createQuery("select at from AttendeesVO at where lower(at.user.firstName) LIKE lower(:searchKeyword)",AttendeesVO.class);  

実際、私の考えでは、%%でLike演算子を使用しています。

searchKeyword+"%"は、で始まる searchKeywordの戻り値を意味します。
"%"+searchKeyword+"%"は、含む searchKeywordの戻り値を意味します。
要件に従って決定します。

18
xyz

キーワードの前後に2つの%を使用するには、声を@sskに追加します。または、クエリ自体で次のように構成すると、よりプロフェッショナルなソリューションになると思います:

public List<AttendeesVO> addAttendees(String searchKeyword) {
    TypedQuery<AttendeesVO> query = entityManager.createQuery(" select at from AttendeesVO 
    at where at.user.firstName LIKE CONCAT('%',:searchKeyword,'%')",AttendeesVO.class);
    query.setParameter("searchKeyword", searchKeyword);
    return query.getResultList();
}

「%」はクエリの一部であるためパラメータではなく、後で入力するもの

CONCAT()関数は、2つ以上の式を一緒に追加します。 https://www.w3schools.com/sql/func_mysql_concat.asp

1
Mohammad