Параметр в предложении like JPQL - PullRequest
82 голосов
/ 27 августа 2009

Я пытаюсь написать JPQL-запрос с предложением like:

LIKE '%:code%'

Я хотел бы иметь код = 4 и найти

455
554
646
...

Я не могу пройти :code = '%value%'

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

потому что в другом месте мне нужен :value, не обернутый % символами Любая помощь?

Ответы [ 7 ]

162 голосов
/ 28 августа 2009

Если вы делаете

LIKE :code

и затем

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

Тогда значение остается свободным от знака «%». Если вам нужно использовать его где-то еще в том же запросе, просто используйте другое имя параметра, отличное от 'code'.

53 голосов
/ 05 апреля 2013

Я не использую именованные параметры для всех запросов. Например, использование именованных параметров в JpaRepository .

является необычным.

В качестве обходного пути я использую функцию JPQL CONCAT (этот код эмулирует , начиная с ):

@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

7 голосов
/ 24 мая 2016

Вы можете использовать функцию JPA LOCATE .

LOCATE (searchString, candidString [, startIndex]) : возвращает первый индекс searchString вандидата. Позиции основаны на 1. Если строка не найдена, возвращает 0.

К вашему сведению: в документации по моему лучшему попаданию в Google параметры были изменены на противоположные.

SELECT 
  e
FROM 
  entity e
WHERE
  (0 < LOCATE(:searchStr, e.property))
2 голосов
/ 17 августа 2018

В API критериев JPA есть хороший метод 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 голосов
/ 20 декабря 2017

Я не знаю, опоздал ли я или вышел за рамки, но, по-моему, я мог бы сделать это так:

String orgName = "anyParamValue";

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

q.setParameter("orgName", orgName);
1 голос
/ 01 июня 2017

Просто опустите ''

LIKE %:code%
0 голосов
/ 29 января 2019
  1. Использовать ниже JPQL-запроса.

выберите i из Инструктора i, где i.address LIKE CONCAT ('%' ,: address, '%') ");

  1. Используйте нижеприведенный код критерия для того же:

    @ Test общественная пустота findAllHavingAddressLike () {CriteriaBuilder cb = criteriaUtils.criteriaBuilder (); CriteriaQuery cq = cb.createQuery (Instructor.class); Root root = cq.from (Instructor.class); printResultList (cq.select (корень) .где (Cb.like (root.get (Instructor_.address), "% # 1074%"))); }

...