我有这个结构:
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_,估计0_.average_ticket为average_2_25_,estimate0_.description为descript3_25_,estimate0_.end_date为end_date4_25_,estimate0_.pax_quantity为pax_quan5_25_,estimate0_.start_date为start_da6_25_ from estimate estimate0_ cross join estimate_sale_item_type interest1_其中estimate0_.id = interested1_.estimate_id和(。in(?))
DEBUG SqlExceptionHelper:124 - 无法提取ResultSet [n / a] org.postgresql.util.PSQLException:没有为参数1指定值。
为什么hibernate正在进行此查询?
我正在使用Hibernate 5.1 Final
答案 0 :(得分: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);
答案 1 :(得分: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();