带有 IN 子句的复合键

Posted

技术标签:

【中文标题】带有 IN 子句的复合键【英文标题】:Composite Key with IN clause 【发布时间】:2014-09-02 08:43:23 【问题描述】:

下面的代码应该返回数据库中primarykeys(idList)匹配的实体列表。

这适用于原始 Id 类型,但对于复合键则不行。请帮我。

Class<?> entityType = TypeToken.of(typeOfEntity).getRawType();
Class<?> idType = TypeToken.of(typeOfId).getRawType();

String idFieldName = getIdFieldName(entityManager, entityType, idType);

CriteriaQuery<?> criteria = entityManager.getCriteriaBuilder().createQuery(entityType);
Root<?> root = criteria.from(entityType);
Expression<ID> expression = root.get(idFieldName);
Predicate predicate = expression.in(idList);

TypedQuery<?> query = entityManager.createQuery(criteria.where(predicate));
return (List<T>) query.getResultList();

我现在正在使用 Hibernate,当我运行测试时,我从 hibernate 日志中得到了以下 sql。

select * from paper_invoice paperinvoi0_ where paperinvoi0_.paymentid=?和 paperinvoi0_.receipt_code=?和 paperinvoi0_.usetype=?

这看起来不错,但会引发异常: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: 无法执行查询。

我不确定这里有什么问题。谁能指出?

【问题讨论】:

【参考方案1】:

Eclipselink 中存在一个错误,该错误会产生如下所示的错误替换查询:

SELECT ID, TITLE FROM BOOK WHERE ((NULL, NULL) IN ((1, 2), (2, 2)))

Syntax error: Encountered "NULL" 失败。使用 Hibernate 生成正确的查询

select book0_.id as id1_0_, book0_.title as title2_0_ from Book book0_ where book0_.id=? and book0_.title=? or book0_.id=? and book0_.title=?

另见this question。

【讨论】:

既然您提到这是错误,请您指出错误(错误 id 或错误 url)吗? 对不起。我正在寻找但没有找到有关此问题的错误报告。对我来说,这显然是一个错误。如果你足够好心,你可以在这里bugs.eclipse.org/bugs/enter_bug.cgi发布一个错误。

以上是关于带有 IN 子句的复合键的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有复合 WHERE 子句的 DataGrip SQL 格式化程序

带有复合键的 Rails RESTful 路由

jpa 多对多,带有附加列和复合键

带有复合键的EntityFramework导航属性

带有tenant_id的Mysql复合索引

使用复合键 (EJB) 的命名查询