web-dev-qa-db-ja.com

like節JPQLのパラメーター

Like句を使用してJPQLクエリを記述しようとしています。

LIKE '%:code%'

Code = 4を見つけて見つけたい

 455 
 554 
 646 
 ... 

:code = '%value%'を渡すことができません

namedQuery.setParameter("%" + this.value + "%");

別の場所では、:value文字でラップされていない%が必要だからです。何か助け?

82
Manuele Piastra

もしあなたがそうするなら

LIKE :code

してから

namedQuery.setParameter("code", "%" + this.value + "%");

その場合、値には「%」記号がありません。同じクエリ内の別の場所で使用する必要がある場合は、単に 'code'以外の別のパラメーター名を使用します。

163
shipmaster

すべてのクエリに名前付きパラメーターを使用しているわけではありません。たとえば、 JpaRepository で名前付きパラメーターを使用することはまれです。

回避策として、JPQL[〜#〜] concat [〜#〜]関数(このコードはstart with):

@Repository
public interface BranchRepository extends JpaRepository<Branch, String> {
    private static final String QUERY = "select b from Branch b"
       + " left join b.filial f"
       + " where f.id = ?1 and b.id like CONCAT(?2, '%')";
    @Query(QUERY)
    List<Branch> findByFilialAndBranchLike(String filialId, String branchCode);
}

私はこのテクニックを優れたドキュメントで見つけました: http://openjpa.Apache.org/builds/1.0.1/Apache-openjpa-1.0.1/docs/manual/jpa_overview_query.html

53
gavenkoa

JPA LOCATE関数 を使用できます。

LOCATE(検索文字列、候補文字列[、startIndex]):候補文字列の検索文字列の最初のインデックスを返します。ポジションは1から始まります。文字列が見つからない場合、0を返します。

参考: my top google hit のドキュメントでは、パラメーターが逆になっています。

SELECT 
  e
FROM 
  entity e
WHERE
  (0 < LOCATE(:searchStr, e.property))
7
David Carlson

私が遅れているか範囲外であるかはわかりませんが、私の意見では次のようにできます:

String orgName = "anyParamValue";

Query q = em.createQuery("Select O from Organization O where O.orgName LIKE '%:orgName%'");

q.setParameter("orgName", orgName);

JPA基準APIにはNice like()メソッドがあります。それを使用してみてください、それが役立つことを願っています。

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery criteriaQuery = cb.createQuery(Employees.class);
Root<Employees> rootOfQuery = criteriaQuery.from(Employees.class);
criteriaQuery.select(rootOfQuery).where(cb.like(rootOfQuery.get("firstName"), "H%"));
2
Haroon

単に省きます ''

LIKE %:code%
1
Sehtim
  1. 以下のJPQLクエリを使用します。

i.address LIKE CONCAT( '%' ,: address、 '%') ");インストラクターiからiを選択します。

  1. 同じために以下の基準コードを使用します。

    @Test public void findAllHavingAddressLike(){CriteriaBuilder cb = criteriaUtils.criteriaBuilder(); CriteriaQuery cq = cb.createQuery(Instructor.class);ルートルート= cq.from(Instructor.class); printResultList(cq.select(root).where(cb.like(root.get(Instructor_.address)、 "%#1074%"))); }

0
Vaneet Kataria