gpt4 book ai didi

java - Spring-Data Repository @Query by class with generic class

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:48:55 24 4
gpt4 key购买 nike

假设我有以下实体:

@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);

}

...但这给了我一个异常(exception),原因是:

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

一种解决方案是替换 Class<T>Class<?> ,然后代码就可以工作了,但显然从那时起我就不再是类型安全的了……

List<Verb> verbs = repository.findByClass(Noun.class);

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

有没有办法用 spring-data 编写这种类型安全的方法,最好不要将所有类型硬编码到它们自己的方法中( findNounsfindVerbs 等)或定义 Repositories对于所有类型?

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

最佳答案

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

关于java - Spring-Data Repository @Query by class with generic class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47052706/

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