使用IN的格式错误的查询

时间:2016-04-12 14:10:09

标签: java hibernate postgresql jpa

我有这个结构:

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

2 个答案:

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