2016-04-12 3 views
0
mit

Ich habe diese Struktur:Malformed Abfrage IN

public enum SaleItemType { 
    CRUISE, 
    DAILY_HOSTING 
} 

public class Estimate { 
    ... 
    private List<SaleItemType> interestedSaleItemTypes; 

    @Column(name = "sale_item_type") 
    @CollectionTable(name = "estimate_sale_item_type", joinColumns = @JoinColumn(name = "estimate_id")) 
    @ElementCollection(targetClass = SaleItemType.class) 
    @Enumerated(EnumType.STRING) 
    public List<SaleItemType> getInterestedSaleItemTypes() { 
     return interestedSaleItemTypes; 
    } 
} 

und ich versuche, eine einfache Abfrage zu tun:

String q = "FROM " + Estimate.class.getSimpleName() + " e" + " WHERE e.interestedSaleItemTypes IN :a"; 
TypedQuery<Estimate> query1 = getEm().createQuery(q, Estimate.class); 
query1.setParameter("a", EnumSet.of(SaleItemType.CRUISE)); 
query1.getResultList(); 

Ich erhalte diese Abfrage (und Fehler) auf dem Protokoll :

DEBUG SQL: 92 - wähle estimate0_.id als id1_25_, estimate0_.average_ticket als average_2_25_, estimate0_.description als descript3_25_, estimate0_.end_date als end_date4_25_, est imate0_.pax_quantity als pax_quan5_25_, estimate0_.start_date als start_da6_25_ aus Schätzung estimate0_ Quer verbinden estimate_sale_item_type interested1_ wo estimate0_.id = interested1_.estimate_id und (. in)

DEBUG SqlExceptionHelper (?): 124 - konnte nicht ResultSet extrahieren [n/a] org.postgresql.util.PSQLException: Kein Wert angegeben für Parameter 1.

Warum Hibernate tut diese Abfrage?

Im Hibernate 5.1 Schluss

+0

Kasse http://stackoverflow.com/questions/4828049/in-clause-in-hql-or-java-persistence-query-language –

Antwort

1

Der IN Ausdruck verwendet werden kann, um zu testen, ob ein Wert in einer Sammlung ist aber interestedSaleItemTypes ist kein einfacher Wert, sondern selbst eine Sammlung. Daher MEMBER OF verwenden:

String q = "FROM Estimate e WHERE :a MEMBER OF e.interestedSaleItemTypes"; 
TypedQuery<Estimate> query1 = getEm().createQuery(q, Estimate.class); 
query1.setParameter("a", SaleItemType.CRUISE); 
+0

Yep, es funktionierte. Lustige Tatsache, wusste ich, wie 'dieses Mal Mitglied of'but verwenden aus irgendeinem Grund ich es als nicht einmal. – Solci

0

Haben Sie versucht, Klammer in Ihrer In-Klausel zu setzen?

Ich weiß nicht, ob es erforderlich ist, aber in allen Tutorials, die ich fand, hatte immer die Klammer. http://www.postgresqltutorial.com/postgresql-in/

Da die IN-Klausel eine Liste von Werten erwartet, können Sie auch setParameterList anstelle von setParameter verwenden. Try this:

String q = "FROM " + Estimate.class.getSimpleName() + " e" + " WHERE e.interestedSaleItemTypes IN (:a)"; 
TypedQuery<Estimate> query1 = getEm().createQuery(q, Estimate.class); 
query1.setParameterList("a", EnumSet.of(SaleItemType.CRUISE)); 
query1.getResultList(); 
+1

die in der Expression von SQL muss Klammern aber die iN express von PPV nicht – wero

+0

@wero Das stimmt, aber Hibernate zum Beispiel braucht Klammern in einigen Versionen, Check-out [Beitrag] (http://stackoverflow.com/questions/2772305/jpql-in-clause-java-arrays- oder Listen-Sätze/2793690 # 2793690) –

+0

es gibt keine solche Methode Query.setParameterList() in JPA –

Verwandte Themen