首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不同实体的CriteriaQuery

不同实体的CriteriaQuery
EN

Stack Overflow用户
提问于 2016-03-23 22:14:06
回答 2查看 84关注 0票数 0

我有一个非常基本的问题,但找不到正确的解决办法。我想使用一个只引用JPAEntity类的CriteriaQuery来读取CriteriaQuery的所有记录,它应该适用于不同的JPAEntites。

“折页守则”行得通,它能做我想做的事:

代码语言:javascript
复制
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();

    ...
}

但我收到了很多关于类型安全的警告。为了解决这个问题,我尝试了下面的更正,同时保持了泛型:

代码语言:javascript
复制
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)使用相同的类型。但我不知道怎么做。有人知道如何正确使用这个模式吗?

谢谢你的暗示。

向你问好,多米尼克

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-24 10:58:45

正如所指出的,泛型findAll方法的签名是

代码语言:javascript
复制
<T> List<T> findAll(Class<T> entity)

我认为概念化的棘手部分是Class<T> entity。但是,如果你看一下createQuery的签名,你会发现它基本上是一样的:

代码语言:javascript
复制
<T> CriteriaQuery<T> createQuery(Class<T> resultClass)

因此,一般的findAll方法如下所示:

代码语言:javascript
复制
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();
}

使用方式如下:

代码语言:javascript
复制
findAll(entity.getClass());

您不能传递一个泛型方法--实体本身,因为它是一个运行时对象,并且泛型是编译时约束。

票数 1
EN

Stack Overflow用户

发布于 2016-03-24 09:01:26

这是个方法问题。也许您可以在您的方法之外调用getType()?

代码语言:javascript
复制
 private <T> List<T> test(Class<T> jpaFieldClass) ....
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36189713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档