java - 针对不同实体的 CriteriaQuery

标签 java jpa

我有一个非常基本的问题,但找不到正确的解决方案。我想使用仅引用 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/

相关文章:

java - Hibernate - 具有排序顺序的多列索引

java - NestedScrollView 重叠工具栏(它们位于 fragment 布局内部)

java - Android Studio 布局编辑器无法呈现自定义 View

java - 具有 M :N or 1:N relationships 的实体的数据传输对象

java - jpa - 两个不同的 @Embeddable 类中的多个 @ElementCollection

java - 仅在某些记录上出现约束违规 spring JPA

java - 为什么 JPA "order by ascending"首先返回大写条目?

java - 保存对其他实体的引用

java - Mule SFTP 文件监听器

java - Hibernate:n+1 且实体图性能缓慢