假设我有以下实体:
@Entity
public class Word { ... }
@Entity
public class Noun extends Word { ... }
@Entity
public class Verb extends Word { ... }
(加上通常的Disriminator-和Join-Strategy的东西,只是假设实体工作正常,他们这样做。)
我试过......
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);
}
...但是这给了我一个例外,原因是:
org.hibernate.QueryException: Not all named parameters have been set: [1] [SELECT x FROM Word x WHERE type(x) = ?1]
一个解决方案是用<{1}} 替换 Class<T>
,然后代码可以运行,但显然不再是类型安全的,因为那时我可以写...
Class<?>
...运行,但每当我尝试访问List<Verb> verbs = repository.findByClass(Noun.class);
时,显然会抛出ClassCastException
,因为列表中的所有对象实际上都是verbs (
,而不是Nouns
)
有没有办法用spring-data编写这个类型安全的,最好不要将所有类型硬编码到他们自己的方法(Verbs
,findNouns
等)或定义findVerbs
所有类型?
编辑:问题似乎是Repositories
方法,它似乎定义了Parameter.isDynamicProjectionParameter(MethodParameter)
参数的特殊行为,因此它们仅用于动态参数,但不能提供给查询本身。嗯。希望有人能解决这个问题。
答案 0 :(得分:1)
我刚遇到同样的问题。对于您/其他每个用户的信息,我提交了一个spring数据jpa问题,您可以在此处关注: https://jira.spring.io/browse/DATAJPA-1257