2014-09-02 35 views
0

下面的一段代码应该返回主键(idList)在DB中匹配的实体列表。带IN子句的复合键

这对原始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,并且当我运行测试时,我从休眠日志中获得了以下SQL。

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

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

我不知道这里有什么问题。任何人都可以指出?

回答

0

有产生不正确地被取代的这样的查询中的EclipseLink一个错误:该失败并Syntax error: Encountered "NULL"

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

。使用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

+0

现在你提到了这个bug,请问我可以指出这个bug(bug id或bug url)吗? – 2014-09-03 02:56:43

+0

对不起。我在寻找,但没有找到这个问题的错误报告。对我来说这显然是一个错误。如果你足够友善,你可以在这里发布一个bug https://bugs.eclipse.org/bugs/enter_bug.cgi。 – zbig 2014-09-03 07:58:35

+0

Bug提交:https://bugs.eclipse.org/bugs/show_bug.cgi?id = 443265 – 2014-09-04 03:25:49