Frage Hinzufügen der IN-Klauselliste zu einer JPA-Abfrage


Ich habe eine NamedQuery erstellt, die wie folgt aussieht:

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

Ich möchte den Parameter inclList mit einer Liste von Elementen anstelle von einem Element ausfüllen. Zum Beispiel wenn ich eine habe new List<String>() { "a", "b", "c" } Wie bekomme ich das im Parameter inclList? Es lässt mich nur eine Saite kodifizieren. Beispielsweise:

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

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

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

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

Ich weiß, ich könnte nur eine Zeichenfolge erstellen und daraus die gesamte Abfrage erstellen, aber ich wollte den Overhead vermeiden. Gibt es einen besseren Weg, dies zu tun?

Verwandte Frage: Wenn die Liste sehr groß ist, gibt es eine gute Möglichkeit, eine solche Abfrage zu erstellen?


96
2017-12-07 16:12


Ursprung


Antworten:


Beim Benutzen IN mit einem Collection-Wert-Parameter, den Sie nicht benötigen (...):

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

149
2017-12-07 16:29



Das richtige JPA-Abfrageformat wäre:

el.name IN :inclList

Wenn Sie eine ältere Version von Hibernate als Provider verwenden, müssen Sie Folgendes schreiben:

el.name IN (:inclList)

aber das ist ein Fehler (HHH-5126) (BEARBEITEN: was wurde jetzt gelöst).


61
2018-01-24 20:14



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

Funktioniert für mich mit JPA 2, Jboss 7.0.2


26
2017-12-24 00:02



Sie müssen in konvertieren List Wie nachfolgend dargestellt:

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

5
2017-12-15 19:38