2016-04-12 2 views
0

У меня есть эта структура:искаженного запроса с использованием 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; 
    } 
} 

И я пытаюсь сделать простой запрос:

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

Я получаю этот запрос (и ошибки) на бревне :

DEBUG SQL: 92 - выберите estimate0_.id в id1_25_, estimate0_.average_ticket как average_2_25_, estimate0_.description как descript3_25_, estimate0_.end_date как end_date4_25_, ЭСТ imate0_.pax_quantity как pax_quan5_25_, оценка0_.start_date как start_da6_25_ из оценки оценки0_ cross join оценить_sale_item_type заинтересован1_ где оценка0_.id = interesting1_.estimate_id и (. в)

DEBUG SqlExceptionHelper (?): 124 - не может извлечь ResultSet [N/A] org.postgresql.util.PSQLException: Не задано значение параметра 1.

Почему спящий режим делает этот запрос?

Im использованием Hibernate 5.1 Final

+0

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

ответ

1

Выражение IN может быть использована для проверки, является ли значение в коллекции, но interestedSaleItemTypes не простое значение, а сама коллекция. Поэтому использование MEMBER OF:

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

Да, это сработало. Забавный факт, я знал, как использовать 'члена ', но по какой-то причине на этот раз я даже не рассматривал его. – Solci

0

Пробовали ли вы поставить скобку в вашем предложении IN?

Я не знаю, требуется ли это, но во всех учебниках, которые я нашел, всегда была скобка. http://www.postgresqltutorial.com/postgresql-in/

Кроме того, поскольку предложение IN ожидает список значений, вы можете использовать setParameterList вместо setParameter. Попробуйте это:

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

ИН выражение SQL нуждается в круглых скобках, но IN expresssion JPA не – wero

+0

@wero True, но Hibernate, например, нуждается в скобках в некоторых версиях, посмотрите [этот пост] (http://stackoverflow.com/questions/2772305/jpql-in-clause-java-arrays- или-lists-sets/2793690 # 2793690) –

+0

Нет такого метода Query.setParameterList() в JPA –

Смежные вопросы