Spring-Data Repository @Query by class with generic class

Flo*_*etz 5 java generics spring jpa spring-data-jpa

假设我有以下实体:

@Entity
public class Word { ... }

@Entity
public class Noun extends Word { ... }

@Entity
public class Verb extends Word { ... }
Run Code Online (Sandbox Code Playgroud)

(加上通常的鉴别器和连接策略的东西,简单地假设实体工作正常,他们确实这样做了。)

我试过 ...

public interface WordRepository extends CrudRepository<Word, Long>{

     @Query("SELECT x FROM Word x WHERE type(x) = ?1")
     <T extends Word> List<T> findByClass(Class<T> clz);

}
Run Code Online (Sandbox Code Playgroud)

...但这给了我一个例外,由以下原因引起:

org.hibernate.QueryException: Not all named parameters have been set: [1] [SELECT x FROM Word x WHERE type(x) = ?1]
Run Code Online (Sandbox Code Playgroud)

一个解决办法是更换 Class<T>Class<?>,那么代码的作品,但很明显,自那以后我可以写的不是类型安全的了...

List<Verb> verbs = repository.findByClass(Noun.class);
Run Code Online (Sandbox Code Playgroud)

...运行,但显然ClassCastException每当我尝试访问时抛出一个,verbs (因为列表中的所有对象实际上都是Nouns,而不是Verbs)

有什么办法来写这个类型安全的带弹簧的数据,最好是没有硬编码各类成自己的方法(findNounsfindVerbs等)或定义Repositories为所有类型的?

编辑:问题似乎出在Parameter.isDynamicProjectionParameter(MethodParameter)方法上,该方法似乎为Class<T>参数定义了一种特殊行为,因此它们仅用于动态参数,而不能提供给查询本身。嗯。希望任何人都有办法解决这个问题。

Tho*_*ang 3

我刚刚遇到了同样的问题。对于您/每个其他用户\xc2\xb4s 信息,我提交了一个 Spring Data jpa 问题,大家可以在此处关注:\n https://jira.spring.io/browse/DATAJPA-1257

\n