web-dev-qa-db-de.com

Parameter in Like-Klausel JPQL

Ich versuche eine JPQL-Abfrage mit einer Like-Klausel zu schreiben:

LIKE '%:code%'

Ich hätte gerne code = 4 und finde

 455 
 554 
 646 
...

Ich kann nicht :code = '%value%' passieren

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

weil an anderer Stelle :value nicht von % Zeichen umschlossen ist. Irgendeine Hilfe?

80
Manuele Piastra

Wenn Sie tun 

LIKE :code

und dann tun 

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

Dann bleibt der Wert frei von dem "%" Zeichen. Wenn Sie es an einer anderen Stelle in derselben Abfrage verwenden müssen, verwenden Sie einfach einen anderen Parameternamen als 'code'.

161
shipmaster

Ich benutze keine benannten Parameter für alle Abfragen. Es ist zum Beispiel ungewöhnlich, benannte Parameter in JpaRepository zu verwenden.

Zur Problemumgehung verwende ich die Funktion JPQL CONCAT (dieser Code emuliert Start mit):

@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);
}

Ich habe diese Technik in ausgezeichneten Dokumenten gefunden: http://openjpa.Apache.org/builds/1.0.1/Apache-openjpa-1.0.1/docs/manual/jpa_overview_query.html

52
gavenkoa

Sie können die JPA LOCATE-Funktion verwenden. 

LOCATE (searchString, KandidatString [ startIndex]): Gibt das .__ zurück. erster Index von searchString in KandidatString. Positionen sind 1-basiert . Wird der String nicht gefunden, wird 0 zurückgegeben.

Zu Ihrer Information: Die Dokumentation auf mein Top-Google-Treffer hatte die Parameter umgekehrt.

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

In der JPA-Kriterien-API gibt es die Methode Nice like (). Versuchen Sie das zu nutzen, ich hoffe es hilft.

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

Ich weiß nicht, ob ich zu spät komme oder nicht, aber meiner Meinung nach könnte ich das so machen:

String orgName = "anyParamValue";

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

q.setParameter("orgName", orgName);

Lass einfach das '' weg

LIKE %:code%
1
Sehtim
  1. Verwenden Sie die folgende JPQL-Abfrage.

wählen Sie i aus Instructor i aus, wo i.Adresse LIKE CONCAT ('%' ,: Adresse, '%') ")" steht;

  1. Verwenden Sie den folgenden Kriteriencode für dasselbe:

    @Prüfung öffentlich nichtig findAllHavingAddressLike () {CriteriaBuilder cb = kriterienUtils.criteriaBuilder (); Kriterienabfrage cq = cb.createQuery (Instructor.class); Wurzelwurzel = cq.from (Instructor.class); printResultList (cq.select (root) .where (cb.like (root.get (Instructor_.address))... "% # 1074% "))); }

0
Vaneet Kataria