【问题标题】:Spring data - domain object inheritance and generic methodsSpring data - 域对象继承和泛型方法
【发布时间】:2012-07-08 17:15:29
【问题描述】:

我有一些域对象:

@Entity
public class Log {

}

@Entity
public class LogLetter extends Log {

}

@Entity
public class LogAction extends Log {

}

我只想拥有一个存储库,让我可以获取 Log 的子代。

我可以在理论上做这样的事情吗?

public interface LogRepository extends CrudRepository<Log, Long> {

    @Query("select from ?1)
    public <T> List<T> getLog(Class<T> clazz);

}

并调用此方法:

List<LogLetter> logLetters = getLog(LogLetters.class);

是否存在其他方法来执行我所描述的操作?

【问题讨论】:

  • 为什么不直接创建LogLetterRepositoryLogActionRepository?它们很便宜,您可以免费获得findAll
  • 这两个域对象只是一个例子,实际上我有 15 个这样的对象,为每个域对象创建新的存储库并不是太优雅。

标签: java generics jpa spring-data


【解决方案1】:

我认为它不可能开箱即用(尤其是考虑到您不能在from 中使用参数),但您可以将其实现为自定义方法(请参阅1.4. Custom implementations):

public <T> List<T> getLog(Class<T> clazz) {
    return em.createQuery("from " + clazz.getSimpleName()).getResultList();
}

【讨论】:

    【解决方案2】:

    你也可以使用#{#entityName}来实现它:

    @Query("SELECT o FROM #{#entityName} o where o.attribute1=:attribute1")
    Page<T> findByAttribute1Custom(@Param("attribute1") String attribute1, Pageable pageable);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-25
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多