JPA存储库是应该由Table还是Object创建的?

时间:2014-04-10 08:45:29

标签: java jpa spring-data-jpa

创建JPA存储库的最佳做法是什么?

目前我有两张桌子:媒体评分

要查找类似的媒体,必须对评级表进行查询,以查找不同媒体之间的互连。然后,此查询会返回媒体对象的列表。

此查询是否应放在评级存储库中(因为它查询评级表), 或者在媒体存储库中(因为它返回了设置了ID的媒体对象的集合)?

我尝试过针对此特定用例搜索最佳做法,但未发现任何相关内容。

更新: SQL查询的定义如下:

@Query(value=[SQL query with several joins],nativeQuery=true)
List<Media> mySQLQuery()

它返回mediaId的列表,可以作为Media个对象从函数返回。

2 个答案:

答案 0 :(得分:0)

好吧,可能都没有。

您看到实现存储库并执行例如findAll()时,您将获得存储库创建中使用的实体中所有对象的列表。

  interface MyRepo implements<Media, Long>....

  myRepo.findAll() will return a List of Media objects.

您尝试执行的操作超出了存储库的范围,因为它仅对该特定实体执行操作对该特定实体执行操作

在我看来,媒体评分与OneToMany或ManyToMany相关联,那么这肯定应该转到单独的DAO方法。

答案 1 :(得分:0)

我通过创建存储库的自定义实现来解决它,实现自定义接口。

首先我必须声明界面:

public interface CustomQuery {
    public List<Integer>myCustomQuery(int id)
}

然后我在自定义存储库中实现了它。名称很重要,它必须以它正在扩展的存储库接口的名称开头。我的repo名为MediaRepository,因此我将自定义实现命名为MediaRepositoryImpl

@Component
public class MediaRepositoryImpl implements CustomQuery {
    @PersistenceContext
    EntityManager manager;

    public List<Integer>myCustomQuery(int id){
        Query q = manager.createNativeQuery(SQL_QUERY_GOES_HERE);
        List<Integer> ids = new ArratList<Integer>();

        @SuppressWarnings("unchecked")
        List<Integer> result  = q.getResultList();
        for(Integer o : result){
            //process the results and add them to the list
        }
        return list;
    }
}

这样,您可以在保持常规存储库清洁的同时执行自定义本机查询。这种方法也更容易测试。