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?
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».
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
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))
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%"));
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%
sélectionnez i dans Instructor i où i.address LIKE CONCAT ('%' ,: address, '%') ");
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) ... "))); }