我有一个非常基本的问题,但找不到正确的解决办法。我想使用一个只引用JPAEntity类的CriteriaQuery来读取CriteriaQuery的所有记录,它应该适用于不同的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)使用相同的类型。但我不知道怎么做。有人知道如何正确使用这个模式吗?
谢谢你的暗示。
向你问好,多米尼克
发布于 2016-03-24 10:58:45
正如所指出的,泛型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());您不能传递一个泛型方法--实体本身,因为它是一个运行时对象,并且泛型是编译时约束。
发布于 2016-03-24 09:01:26
这是个方法问题。也许您可以在您的方法之外调用getType()?
private <T> List<T> test(Class<T> jpaFieldClass) ....https://stackoverflow.com/questions/36189713
复制相似问题