为了账号安全,请及时绑定邮箱和手机立即绑定

与 Spring Data JPA 和泛型类型混淆

与 Spring Data JPA 和泛型类型混淆

九州编程 2021-10-27 16:21:01
表格:StudentHistory 1--->n StudentTeacherHistory 1--->n Teacher我尝试重新组合历史的 JPA 行为,因为它们做同样的事情(例如,从给定的历史中检索学生/老师)。具有泛型类型的实体:// Entitiespublic abstract class AbstractHistory <T> {}public class StudentHistory extends AbstractHistory<Student> {}public class TeacherHistory extends AbstractHistory<Teacher> {}具有通用类型的存储库:// repositoriespublic interface IHistoryRepository<T> extends CrudRepository<AbstractHistory<T>, Long> {    public AbstractHistory<T> findFirst();}    public interface StudentHistoryRepository extends IHistoryRepository<Student> {}public interface TeacherHistoryRepository extends IHistoryRepository<Teacher> {}我虽然可以这样做:StudentHistory stuHisto = new StudentHistoryRepository().findFirst(); 但我收到此错误:    // err ->  Type mismatch: cannot convert from AbstractHistory<Student> to StudentHistory1/ 为什么我不能从我的 'StudentHistoryRepository' 中检索一个 'StudentHistory' ?2/ 我应该如何处理?
查看完整描述

1 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

你有这个问题,因为你的方法显式返回一个AbstractHistory而不是子类型。


你需要投...

...如果只有您的存储库实现理解每个 T 您都会获得特定的历史记录。

您可以尝试添加另一种类型,但我担心它会失败:


public interface IHistoryRepository<

  T,

  H extends AbstractHistory<T>

> extends CrudRepository<H, Long> {

    public H findFirst();

}    

public interface StudentHistoryRepository extends IHistoryRepository<Student, StudentHistory> {}

public interface TeacherHistoryRepository extends IHistoryRepository<Teacher, TeacherHistory> {}

我不知道您使用的是什么框架,可能是名称中的 Spring Data;虽然我过去用过它,但我不知道它是否能够做到这一点。


毕竟,它需要获取具体类,并且由于它是泛型,因此类型擦除可能会干扰(如果关于表示 H 的具体类型的信息在反射中丢失,那么 Spring Data 在这里可能无法做太多事情,除非您用注释或其他东西帮助它)。


另一个应该可行的解决方案是按每个子界面执行此操作:


public interface StudentHistoryRepository extends CrudRepository<StudentHistory, Long> {

  StudentHistory findFirst();

}

或者使用另一个接口:


  public interface FindFirst<T> {

    T findFirst();

  }


  public interface StudentHistoryRepository extends CrudRepository<StudentHistory, Long>, FindFirst<StudentHistory> {}


查看完整回答
反对 回复 2021-10-27
  • 1 回答
  • 0 关注
  • 202 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信