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)
有什么办法来写这个类型安全的带弹簧的数据,最好是没有硬编码各类成自己的方法(findNouns,findVerbs等)或定义Repositories为所有类型的?
编辑:问题似乎出在Parameter.isDynamicProjectionParameter(MethodParameter)方法上,该方法似乎为Class<T>参数定义了一种特殊行为,因此它们仅用于动态参数,而不能提供给查询本身。嗯。希望任何人都有办法解决这个问题。
我刚刚遇到了同样的问题。对于您/每个其他用户\xc2\xb4s 信息,我提交了一个 Spring Data jpa 问题,大家可以在此处关注:\n https://jira.spring.io/browse/DATAJPA-1257
\n| 归档时间: |
|
| 查看次数: |
1116 次 |
| 最近记录: |