पैरामीटर जेपीक्यूएल क्लॉज की तरह


90

मैं एक खंड के साथ JPQL क्वेरी लिखने की कोशिश कर रहा हूँ:

LIKE '%:code%'

मुझे कोड = 4 और ढूंढना होगा

455
554
646
...

मैं पास नहीं हो सकता :code = '%value%'

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

क्योंकि किसी अन्य स्थान पर मुझे वर्णों :valueसे %लिपटने की आवश्यकता नहीं है । कोई मदद?


2
@ मेन्यूले पाइस्त्रा: क्या आप क्या देख रहे थे इसका जवाब नीचे नहीं है?
wmorrison365

जवाबों:


169

यदि तुम करो

LIKE :code

और फिर करते हैं

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

तब मान '%' चिह्न से मुक्त रहता है। यदि आपको इसे उसी क्वेरी में कहीं और उपयोग करने की आवश्यकता है तो बस 'कोड' के अलावा किसी अन्य पैरामीटर नाम का उपयोग करें।


9
रिकॉर्ड के लिए, यह आपको JPQL इंजेक्शन हमलों के लिए खुला नहीं छोड़ता है क्योंकि यह स्वचालित रूप से आपके लिए ठीक से बच गया है।
लेज़्ज़्लो वैन डेन होके

3
यही "%" + this.value + "%"बच जाता है।
गुस्तावो

2
मैं इस मामले को असंवेदनशील कैसे बनाऊं?
ईएम-क्रिएशंस

55

मैं सभी प्रश्नों के लिए नामित मापदंडों का उपयोग नहीं करता हूं। उदाहरण के लिए 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


2
नोट: CONCAT (2; 2%) पैरामीटर के अंत में '%' जोड़ देगा, इसे पैरामीटर के आरंभ और अंत में जोड़ने के लिए CONCAT ('%'; 2; '%') का उपयोग करें।
मुइज़ महदी

7

आप JPA LOCATE फ़ंक्शन का उपयोग कर सकते हैं ।

LOCATE (searchString, CandidString [, startIndex]) : CandidString में searchString के पहले इंडेक्स को लौटाता है। पद 1-आधारित हैं। यदि स्ट्रिंग नहीं मिली है, तो 0 देता है।

FYI करें: मेरे शीर्ष Google हिट के प्रलेखन में पैरामीटर उलट थे।

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

1
मेरे लिए सबसे अच्छा समाधान - कोई संघनन, कोई SQL इंजेक्शन नहीं।
17

4

मुझे नहीं पता कि मैं देर से या दायरे से बाहर हूं, लेकिन मेरी राय में मैं ऐसा कर सकता था:

String orgName = "anyParamValue";

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

q.setParameter("orgName", orgName);

2

JPA मानदंड API में अच्छा () तरीका है। उस का उपयोग करने की कोशिश करें, आशा है कि यह मदद करेगा।

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. नीचे JPQL क्वेरी का उपयोग करें।
select i from Instructor i where i.address LIKE CONCAT('%',:address ,'%')");
  1. नीचे दिए गए मानदंड कोड का उपयोग करें:
@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

बस '' छोड़ दो

LIKE %:code%

डाउनवोट: काम नहीं कर रहा है, यह पैरामीटर नाम को कोड%
केसर

0

रिपॉजिटरी इंटरफ़ेस का उपयोग करें 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());
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.