web-dev-qa-db-fra.com

Paramètre dans la clause like JPQL

J'essaie d'écrire une requête JPQL avec une clause like:

LIKE '%:code%'

Je voudrais avoir code = 4 et trouver

 455 
 554 
 646 
...

Je ne peux pas passer :code = '%value%'

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

parce que dans un autre endroit j'ai besoin de :value non enveloppé par les caractères % De l'aide?

80
Manuele Piastra

Si tu fais 

LIKE :code

et ensuite faire 

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

La valeur reste alors libre du signe '%'. Si vous avez besoin de l'utiliser ailleurs dans la même requête, utilisez simplement un autre nom de paramètre que «code».

161
shipmaster

Je n'utilise pas de paramètres nommés pour toutes les requêtes. Par exemple, il est inhabituel d'utiliser des paramètres nommés dans JpaRepository .

Pour résoudre ce problème, j'utilise la fonction JPQL CONCAT (ce code imule commence par):

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

J'ai trouvé cette technique d'excellents docs: http://openjpa.Apache.org/builds/1.0.1/Apache-openjpa-1.0.1/docs/manual/jpa_overview_query.html

52
gavenkoa

Vous pouvez utiliser la fonction JPA LOCATE

LOCATE (searchString, candidateString [ startIndex]): renvoie le premier index de searchString dans candidateString. Les positions sont 1-based . Si la chaîne n'est pas trouvée, renvoie 0.

FYI: La documentation sur mon coup de Google haut avait les paramètres inversés.

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

Il existe une méthode Nice like () dans l'API de critères JPA. Essayez de l'utiliser, espérons que cela vous aidera.

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

Je ne sais pas si je suis en retard ou hors champ, mais à mon avis je pourrais le faire comme:

String orgName = "anyParamValue";

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

q.setParameter("orgName", orgName);

Laissez juste le ''

LIKE %:code%
1
Sehtim
  1. Utilisez ci-dessous la requête JPQL.

sélectionnez i dans Instructor i où i.address LIKE CONCAT ('%' ,: address, '%') ");

  1. Utilisez le code de critère ci-dessous pour le même:

    @Tester vide public findAllHavingAddressLike () {CriteriaBuilder cb = critèresUtils.criteriaBuilder (); CriteriaQuery cq = cb.createQuery (Instructor.class); Racine racine = cq.from (Instructor.class); printResultList (cq.select (racine) ... "))); }

0
Vaneet Kataria