我有一个非常基本的问题,但找不到正确的解决方案。我想使用仅引用 JPAEntity 类的 CriteriaQuery 读取 JPAEntity 的所有记录,它应该适用于不同的 JPAEntites。
以下代码有效,并且满足我的要求:
private void test(Field jpaField) {
List l;
final Class c = jpaField.getType();
final CriteriaQuery criteriaQuery = em.getCriteriaBuilder().createQuery(c);
criteriaQuery.select( criteriaQuery.from( c ) );
l = em.createQuery(criteriaQuery).getResultList();
...
}
但是我收到很多关于类型安全的警告。我尝试了以下更正来解决这个问题,同时保持通用:
private void test(Field jpaField) {
List<?> l;
final Class<?> c = jpaField.getType();
final CriteriaQuery<?> criteriaQuery = em.getCriteriaBuilder().createQuery(c);
criteriaQuery.select( criteriaQuery.from( c ) );
l = em.createQuery(criteriaQuery).getResultList();
...
}
但现在我收到有关类型不匹配的错误。我想我必须以某种方式确保 createQuery(c) 和 from(c) 使用相同的类型。但我不知道怎么办。有谁知道如何正确使用这个模式?
感谢您的任何提示。
最诚挚的问候,多米尼克
最佳答案
正如所指出的,通用 findAll
的签名方法是
<T> List<T> findAll(Class<T> entity)
我认为概念化的棘手部分是 Class<T> entity
。但是,如果你看一下 createQuery
的签名你会发现它基本上是一样的:
<T> CriteriaQuery<T> createQuery(Class<T> resultClass)
所以是一个通用的 findAll
方法写法如下:
public <T> List<T> findAll(Class<T> entity) {
CriteriaQuery<T> q = em.getCriteriaBuilder().createQuery(entity);
q.select(q.from(entity));
return em.createQuery(q).getResultList();
}
像这样使用:
findAll(entity.getClass());
您无法将泛型方法传递给实体本身,因为它是运行时对象,而泛型有编译时间限制。
关于java - 针对不同实体的 CriteriaQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36189713/