JPQL gibi tümcecikteki parametre


92

Benzer bir cümle ile bir JPQL sorgusu yazmaya çalışıyorum:

LIKE '%:code%'

Kod = 4 olmasını istiyorum ve

455
554
646
...

Geçemem :code = '%value%'

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

çünkü başka bir yerde karakterlere :valuesarılmasına ihtiyacım yok %. Herhangi bir yardım?


2
@Manuele Piastra: Aşağıdaki cevap aradığınız şey değil mi?
wmorrison365

Yanıtlar:


170

Yaparsan

LIKE :code

ve sonra yap

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

Daha sonra değer '%' işaretinden bağımsız kalır. Aynı sorgu içinde başka bir yerde kullanmanız gerekirse, 'kod' dışında başka bir parametre adı kullanın.


9
Kayıt için, bu sizi JPQL enjeksiyon saldırılarına açık bırakmaz çünkü this.value sizin için otomatik olarak doğru bir şekilde önlenir.
László van den Hoek

3
Bu "%" + this.value + "%"kaçan budur.
Gustavo

2
Bu büyük / küçük harfe duyarsız hale nasıl getirebilirim?
EM-Creations

55

Tüm sorgular için adlandırılmış parametreler kullanmıyorum. Örneğin JpaRepository'de adlandırılmış parametreleri kullanmak alışılmadık bir durumdur .

Çözüm için JPQL CONCAT işlevini kullanıyorum (bu kod öykünmesi şununla başlar ):

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

Bu tekniği mükemmel belgelerde buldum: http://openjpa.apache.org/builds/1.0.1/apache-openjpa-1.0.1/docs/manual/jpa_overview_query.html


2
Not: CONCAT (? 2, '%') parametrenin sonuna '%' ekleyecektir, bunu parametrenin başına ve sonuna eklemek için CONCAT ('%',? 2, '%') kullanın.
Muizz Mahdy

7

JPA LOCATE işlevini kullanabilirsiniz .

LOCATE (searchString, candidateString [, startIndex]) : candidateString'deki searchString'in ilk dizinini döndürür. Pozisyonlar 1 tabanlıdır. Dize bulunmazsa 0 döndürür.

Bilginize: En iyi google hit'imdeki dokümantasyon parametreleri tersine çevirdi.

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

1
benim için en iyi çözüm - birleştirme yok, SQL enjeksiyonu yok.
hgoebl

4

Geç mi yoksa kapsam dışında mıyım bilmiyorum ama bence şöyle yapabilirim:

String orgName = "anyParamValue";

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

q.setParameter("orgName", orgName);

3

JPA kriterleri API'sinde güzel like () yöntemi var. Bunu kullanmaya çalışın, umarım yardımcı olur.

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

1
  1. Aşağıdaki JPQL sorgusunu kullanın.
select i from Instructor i where i.address LIKE CONCAT('%',:address ,'%')");
  1. Aynı için aşağıdaki Kriter kodunu kullanın:
@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%")));
}

0

Sadece ''

LIKE %:code%

Olumsuz oy: çalışmıyor, bu parametre adını% koduna değiştirir
kaiser

0

Depo arayüzü olarak JpaRepositoryveya kullanın 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());
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.