Я пытаюсь написать запрос JPQL с подобным предложением:
LIKE '%:code%'
Я хотел бы иметь код = 4 и найти
455 554 646 ...
Я не могу пройти :code = '%value%'
namedQuery.setParameter("%" + this.value + "%");
потому что в другом месте мне :value
не нужно оборачивать %
символы. Любая помощь?
Ответы:
Если вы сделаете
а затем сделать
namedQuery.setParameter("code", "%" + this.value + "%");
Тогда значение останется свободным от знака «%». Если вам нужно использовать его где-то еще в том же запросе, просто используйте другое имя параметра, отличное от 'code'.
источник
"%" + this.value + "%"
то, чего удалось избежать.Я не использую именованные параметры для всех запросов. Например, в 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
источник
Вы можете использовать функцию JPA LOCATE .
К вашему сведению: в документации к моему главному хиту Google были изменены параметры.
SELECT e FROM entity e WHERE (0 < LOCATE(:searchStr, e.property))
источник
Я не знаю, опаздываю ли я или выхожу за рамки, но, на мой взгляд, я мог бы сделать это так:
String orgName = "anyParamValue"; Query q = em.createQuery("Select O from Organization O where O.orgName LIKE '%:orgName%'"); q.setParameter("orgName", orgName);
источник
В 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%"));
источник
select i from Instructor i where i.address LIKE CONCAT('%',:address ,'%')");
@Test public void findAllHavingAddressLike() { CriteriaBuilder cb = criteriaUtils.criteriaBuilder(); CriteriaQuery<Instructor> cq = cb.createQuery(Instructor.class); Root<Instructor> root = cq.from(Instructor.class); printResultList(cq.select(root).where( cb.like(root.get(Instructor_.address), "%#1074%"))); }
источник
Просто оставьте "
источник
Использовать
JpaRepository
илиCrudRepository
как интерфейс репозитория:@Repository public interface CustomerRepository extends JpaRepository<Customer, Integer> { @Query("SELECT t from Customer t where LOWER(t.name) LIKE %:name%") public List<Customer> findByName(@Param("name") String name); } @Service(value="customerService") public class CustomerServiceImpl implements CustomerService { private CustomerRepository customerRepository; //... @Override public List<Customer> pattern(String text) throws Exception { return customerRepository.findByName(text.toLowerCase()); } }
источник