জেপিকিউএল এর মতো পরামিতি


90

আমি একটি জেপিকিউএল কোয়েরিটি একটি অনুরূপ ধারা সহ লেখার চেষ্টা করছি:

LIKE '%:code%'

আমি কোড = 4 পেতে চাই এবং সন্ধান করতে চাই

455
554
646
...

আমি পাস করতে পারি না :code = '%value%'

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

কারণ অন্য জায়গায় আমার চরগুলি :valueদিয়ে জড়ানো দরকার নেই %। কোন সাহায্য?


4
@ মানুয়েল পাইস্ত্রা: নীচের উত্তরটি আপনি যা খুঁজছিলেন তা নয়?
wmorrison365

উত্তর:


169

যদি তুমি করো

LIKE :code

এবং তারপর না

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

তারপরে মান '%' চিহ্ন থেকে মুক্ত থাকে। আপনার যদি একই কোয়েরিতে অন্য কোথাও ব্যবহার করার প্রয়োজন হয় তবে কেবল 'কোড' ব্যতীত অন্য একটি প্যারামিটারের নাম ব্যবহার করুন।


9
রেকর্ডের জন্য, এটি আপনাকে জেপিকিউএল ইনজেকশন আক্রমণগুলিতে উন্মুক্ত রাখবে না কারণ এই মূল্যটি আপনার জন্য স্বয়ংক্রিয়ভাবে যথাযথভাবে পালিয়ে গেছে।
László ভ্যান ডেন Hoek

4
এটাই "%" + this.value + "%"পালিয়ে গেছে।
গুস্তাভো

4
আমি কীভাবে এই কেসটিকে সংবেদনশীল না করব?
ইএম-ক্রিয়েশান

55

আমি সমস্ত প্রশ্নের জন্য নামযুক্ত পরামিতি ব্যবহার করি না। উদাহরণস্বরূপ, জেপাআরপোসিটোরিতে নামযুক্ত পরামিতিগুলি ব্যবহার করা অস্বাভাবিক ।

কার্যসংক্রান্ত আমি 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


4
দ্রষ্টব্য: কনক্যাট (? 2, '%') প্যারামিটারের শেষে '%' যুক্ত করবে, প্যারামিটারের শুরু এবং শেষের দিকে এটি যুক্ত করতে কনক্যাট ('%',? 2, '%') ব্যবহার করবে।
মুজিজ মাহদী

7

আপনি জেপিএ লোকেশন ফাংশনটি ব্যবহার করতে পারেন ।

লোকেশন (সার্চস্ট্রিং, ক্রেডিট স্ট্রিং [, স্টার্টইনডেক্স]) : ক্রেডিটস্ট্রিংয়ে সার্চস্ট্রিংয়ের প্রথম সূচক ফেরত দেয়। পদগুলি 1-ভিত্তিক। যদি স্ট্রিংটি পাওয়া না যায় তবে 0 প্রদান করে।

এফওয়াইআই: আমার শীর্ষ গুগল হিটের ডকুমেন্টেশনের প্যারামিটারগুলি বিপরীত হয়েছে।

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

4
আমার জন্য সবচেয়ে ভাল সমাধান - কোন কনটেন্টেশন, কোনও এসকিউএল ইঞ্জেকশন নেই।
hgoebl

4

আমি জানি না যে আমি দেরিতে আছি বা সুযোগের বাইরে চলেছি তবে আমার মতে আমি এটি এর মতো করতে পারলাম:

String orgName = "anyParamValue";

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

q.setParameter("orgName", orgName);

2

জেপিএ মানদণ্ড এপিআই-তে দুর্দান্ত () পদ্ধতি রয়েছে। এটি ব্যবহার করার চেষ্টা করুন, আশা করি এটি সাহায্য করবে।

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

সংগ্রহস্থল ইন্টারফেস হিসাবে 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());
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.