带有泛型类的Spring-Data Repository @Query

时间:2017-11-01 10:26:04

标签: java spring generics jpa spring-data-jpa

假设我有以下实体:

@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编写这个类型安全的,最好不要将所有类型硬编码到他们自己的方法(VerbsfindNouns等)或定义findVerbs所有类型?

编辑:问题似乎是Repositories方法,它似乎定义了Parameter.isDynamicProjectionParameter(MethodParameter)参数的特殊行为,因此它们仅用于动态参数,但不能提供给查询本身。嗯。希望有人能解决这个问题。

1 个答案:

答案 0 :(得分:1)

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