Параметр в подобном разделе JPQL

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

LIKE '%:code%'

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

455
554
646
...

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

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

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

Ответ 1

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

LIKE :code

а затем do

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

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

Ответ 2

Я не использую именованные параметры для всех запросов. Например, необычно использовать именованные параметры в 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

Ответ 3

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

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

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

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

Ответ 4

В 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%"));

Ответ 5

Просто оставьте "

LIKE %:code%

Ответ 6

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

String orgName = "anyParamValue";

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

q.setParameter("orgName", orgName);

Ответ 7

  1. Используйте ниже JPQL-запрос.

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

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

    }