下面的代码应该返回主键(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:无法执行查询。
我不确定这里的问题是什么。有谁可以指出?
答案 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=?