IN子句的复合键

时间:2014-09-02 08:43:23

标签: java hibernate jpa eclipselink

下面的代码应该返回主键(idList)在DB中匹配的实体列表。

这适用于原始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。

从paper_invoice paperinvoi0_中选择*,其中paperinvoi0_.paymentid =?和paperinvoi0_.receipt_code =?和paperinvoi0_.usetype =?

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

我不确定这里的问题是什么。有谁可以指出?

1 个答案:

答案 0 :(得分:0)

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