একটি জেপিএ ক্যোয়ারিতে ক্লোজ লিস্টে যুক্ত করা


124

আমি এমন একটি নেমডিক্যুয়ারি তৈরি করেছি যা দেখতে এরকম দেখাচ্ছে:

@NamedQuery(name = "EventLog.viewDatesInclude",
        query = "SELECT el FROM EventLog el WHERE el.timeMark >= :dateFrom AND "
        + "el.timeMark <= :dateTo AND "
        + "el.name IN (:inclList)")

আমি যা করতে চাই তা হ'ল প্যারামিটারটি পূরণ করুন: একটি আইটেমের পরিবর্তে আইটেমের তালিকা সহ অন্তর্ভুক্ত করুন। উদাহরণস্বরূপ, যদি আমার কাছে থাকে তবে আমি new List<String>() { "a", "b", "c" }কীভাবে এটি পেতে পারি: InclList প্যারামিটারে? এটি কেবল আমাকে একটি স্ট্রিং কোডিং করতে দেয়। উদাহরণ স্বরূপ:

setParameter("inclList", "a") // works

setParameter("inclList", "a, b") // does not work

setParameter("inclList", "'a', 'b'") // does not work

setParameter("inclList", list) // throws an exception

আমি জানি আমি কেবল একটি স্ট্রিং তৈরি করতে পারি এবং এটি থেকে পুরো ক্যুরি তৈরি করতে পারি, তবে আমি ওভারহেড এড়াতে চেয়েছিলাম। এটি করার আরও ভাল উপায় আছে?

সম্পর্কিত প্রশ্ন: তালিকাটি যদি খুব বড় হয় তবে কোয়েরি তৈরির কোনও ভাল উপায় আছে কি?


এটি স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 1557085/… এর সদৃশ তবে এই থ্রেডটি দরকারী উত্তর সরবরাহ করে।
মাইক রায়ান

উত্তর:


181

INসংগ্রহ-মূল্যবান প্যারামিটার ব্যবহার করার সময় আপনার প্রয়োজন হবে না (...):

@NamedQuery(name = "EventLog.viewDatesInclude", 
    query = "SELECT el FROM EventLog el WHERE el.timeMark >= :dateFrom AND " 
    + "el.timeMark <= :dateTo AND " 
    + "el.name IN :inclList") 

6
নাহ ... আমি আমার বিপরীতে যদি আমি ব্যবহার করি: inclList হয় তবে এটি কাজ করছে না। আমি যদি IN (: inclList) ব্যবহার করি তবে এটি কার্যকর হয়।
গুঞ্জন শাহ

1
এছাড়াও উল্লেখ করার মতো নোট করুন: আপনার পরমের ধরণটি অবজেক্টগুলির সংগ্রহ (অ্যারে নয়) হতে হবে। অবজেক্টগুলি অবশ্যই ক্ষেত্রের প্রকারের সাথে মেলে। .toString () ক্লাস
স্ট্রিংয়ের

2
আমি মনে করি এটি হাইবারনেটের সংস্করণগুলির সাথে পরিবর্তিত হয়েছে, যতদূর আমি মনে করতে পারি IN ব্যবহার করার সময় ভেরিয়েবলের চারপাশে প্যারান্থেসিস না রাখলে আমি একটি ত্রুটি পেয়েছি। যদি পিছনের দিকে সামঞ্জস্য না হয় তবে অদ্ভুত ..
টবব

1
এটি প্রকৃতপক্ষে একটি হাইবারনেট বাগ (প্রথম বন্ধনী প্রয়োজন) যা 3.6.1 এ ঠিক করা হয়েছে
মাদুর

1
সম্পর্কিত প্রশ্নের জন্য: খুব বড় তালিকার ক্ষেত্রে প্রয়োগের ক্ষেত্রে সীমাবদ্ধতা থাকতে পারে। যেমন ওরাকল 11 গ্রাম। সর্বোচ্চ। প্যারামিটার হিসাবে 1000 তালিকার উপাদানগুলি সম্ভব। একটি কর্মবিধি হ'ল সাবলিস্টে তালিকাটি কাটা এবং ফলাফল সংগ্রহ করা। জেপিএ নিজেই তালিকা আকার সীমাবদ্ধ করে না।
মাহ্টিয়াস শ্র্রেবিয়ার

81

সঠিক জেপিএ ক্যোয়ারী বিন্যাসটি হ'ল:

el.name IN :inclList

আপনি যদি সরবরাহকারী হিসাবে হাইবারনেটের একটি পুরানো সংস্করণ ব্যবহার করেন তবে আপনাকে লিখতে হবে:

el.name IN (:inclList)

তবে এটি একটি বাগ ( এইচএইচএইচ -5126 ) (EDIT: যা এতক্ষণে সমাধান করা হয়েছে)।


5
হাইবারনেট ব্যবহার ()
রব এল

31
public List<DealInfo> getDealInfos(List<String> dealIds) {
        String queryStr = "SELECT NEW com.admin.entity.DealInfo(deal.url, deal.url, deal.url, deal.url, deal.price, deal.value) " + "FROM Deal AS deal where deal.id in :inclList";
        TypedQuery<DealInfo> query = em.createQuery(queryStr, DealInfo.class);
        query.setParameter("inclList", dealIds);
        return query.getResultList();
    }

JPA 2, Jboss 7.0.2 নিয়ে আমার জন্য কাজ করে


9

Listনীচে প্রদর্শিত হিসাবে আপনি রূপান্তর করতে হবে :

    String[] valores = hierarquia.split(".");       
    List<String> lista =  Arrays.asList(valores);

    String jpqlQuery = "SELECT a " +
            "FROM AcessoScr a " +
            "WHERE a.scr IN :param ";

    Query query = getEntityManager().createQuery(jpqlQuery, AcessoScr.class);                   
    query.setParameter("param", lista);     
    List<AcessoScr> acessos = query.getResultList();

এই উত্তরটি আমাকে সাহায্য করেছিল
ক্যাবিজি 99
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.