为多态实体编写Spring数据存储库-InheritanceType.SINGLE_TABLE

时间:2018-11-07 20:44:33

标签: java spring hibernate jpa spring-data

您好,我有以下示例:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "EVENT_TYPE")
abstract class BaseEvent {
}
@Entity
@DiscriminatorValue("ACCEPT_EVENT")
class AcceptEvent {

}

@Entity
@DiscriminatorValue("CANCEL_EVENT")
class CancelEvent {

}

我想为此多态实体编写一个存储库。问题是我可能有很多EventType,所以如果我不必为每个Event Type编写一个Repository类,我会更喜欢。我希望#{#entityName}可以在这样的通用存储库中应用:

interface EventRepositort<T> extends CRUDRepository<T> {

   @Query(select e from #{#entityName} e where e.completionDate is null)
   public T findIncompleteEvents();
}

我希望如果我有一项服务,并使用特定的通用类型注入存储库,它将找出#{#entityName}是什么,所以我做了以下事情:

@Service
class EventService {
  @Autowire
  private EventRepository<AcceptEvent> acceptEventRepo;

  public runUnfinishedEvents() {
      List<AcceptEvent> unfinishedEvents = acceptEventRepo.findIncompleteEvents();
  }
}

尽管我已经定义了事件存储库上的泛型类型,但它仍然可以解决,但findIncompleteEvents方法无法使用#{#entityName}解析泛型声明,它基本上会返回CancelEvent和AcceptEvent

现在我的问题:

有没有一种方法可以表达我想要的内容,而无需为BaseEvent的每个子类编写10个不同的存储库?

0 个答案:

没有答案