JPA Sorgusuna IN cümle listesi ekleme


125

Şuna benzeyen bir NamedQuery oluşturdum:

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

Yapmak istediğim şey: inclList parametresini tek bir öğe yerine öğe listesiyle doldurmak. Örneğin, new List<String>() { "a", "b", "c" }bunu: inclList parametresinde nasıl elde ederim? Sadece bir dizgeyi kodlamama izin veriyor. Örneğin:

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

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

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

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

Sadece bir dizi oluşturabileceğimi ve tüm Sorguyu bundan oluşturabileceğimi biliyorum, ancak ek yükten kaçınmak istedim. Bunu yapmanın daha iyi bir yolu var mı?

İlgili soru: Liste çok büyükse, böyle bir sorgu oluşturmanın iyi bir yolu var mı?


Bu, stackoverflow.com/questions/1557085/… adresinin bir kopyasıdır, ancak bu ileti dizisi yararlı yanıtlar sağlar.
Mike Ryan

Yanıtlar:


182

Kullanırken INbir koleksiyon değerli parametresi ile İhtiyacınız olmayan (...):

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

6
Hayır ... benim durumum tam tersi. Eğer kullanırsam: inclList o zaman çalışmıyor. IN (: inclList) kullanırsam işe yarıyor.
Gunjan Shah

1
Ayrıca şunu da unutmayın: parametrenizin türü, nesnelerden oluşan bir koleksiyon (dizi değil) olmalıdır. Nesneler, alanın türüyle eşleşmelidir. ) (.ToString sınıfı String yerine geçmez
dube

2
Sanırım bu, Hibernate sürümlerinde değişen bir şey, hatırlayabildiğim kadarıyla IN kullanırken değişken etrafında parantez olmadığında bir hata aldım. Geriye dönük uyumlu değilse garip ..
Tobb

1
Bu gerçekten bir hazırda bekletme hatasıydı (parantez ihtiyacı) 3.6.1
Mat

1
İlgili soru için: Çok büyük bir liste olması durumunda, uygulamada sınırlamalar olabilir. Örneğin oracle 11g. mak. Parametre olarak 1000 liste öğesi mümkündür. Çözüm, listeyi alt listeler halinde kesmek ve sonuçları toplamaktır. JPA'nın kendisi liste boyutunu kısıtlamaz.
Mahttias Schrebiér

81

Uygun JPA sorgu biçimi şöyle olacaktır:

el.name IN :inclList

Sağlayıcınız olarak Hibernate'in eski bir sürümünü kullanıyorsanız şunları yazmanız gerekir:

el.name IN (:inclList)

ama bu bir hatadır ( HHH-5126 ) (EDIT: şimdiye kadar çözülmüştür).


5
Hazırda bekletme kullanımının eski sürümlerini ayırt ettiğiniz için teşekkür ederiz ()
Rob L

32
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 ile benim için çalışıyor


9

ListAşağıda gösterildiği gibi dönüştürmeniz gerekir :

    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();

Thx bu cevap bana yardımcı oldu
cabaji99
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.