gpt4 book ai didi

java - 针对不同实体的 CriteriaQuery

转载 作者:行者123 更新时间:2023-12-01 10:09:56 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com