带有 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 子句的复合键的主要内容,如果未能解决你的问题,请参考以下文章