【问题标题】:Malformed query using IN使用 IN 的格式错误的查询
【发布时间】:2016-08-03 05:09:12
【问题描述】:

我有这个结构:

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_,estimate0_.pax_quantity 作为pax_quan5_25_,estimate0_.start_date 作为start_da6_25_ 来自estimate0_cross join感兴趣1_ whereestimate0_.id=interested1_.estimate_id 和 (.in (?))

调试 SqlExceptionHelper:124 - 无法提取 ResultSet [n/a] org.postgresql.util.PSQLException: 没有为参数 1 指定值。

为什么hibernate会做这个查询?

我使用的是 Hibernate 5.1 Final

【问题讨论】:

标签: java hibernate postgresql jpa


【解决方案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);

【讨论】:

  • 是的,它奏效了。有趣的是,我知道如何使用member of,但出于某种原因,这次我什至没有考虑。
【解决方案2】:

您是否尝试在 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();

【讨论】:

  • SQL的IN表达式需要括号,而JPA的IN表达式不需要
  • @wero 是的,但 Hibernate 例如在某些版本中需要括号,请查看this post
  • JPA中没有Query.setParameterList()这样的方法
猜你喜欢
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多