在JPA存储库中使用查询是否是正确的做法?

时间:2018-08-01 06:18:02

标签: java spring spring-data-jpa spring-data jpql

我目前正在使用spring数据存储库进行查询(多实体联接),然后返回POJO对象的列表。这样可以吗?

例如,我看到了代码,其中代码是从存储库中的查询方法返回的。

import java.util.Optional;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.Repository;
import org.springframework.data.repository.query.Param;
import com.example.Sample

interface TodoRepository extends Repository<Todo, Long> { 

    @Query("SELECT new com.example.Sample(t.title, b.author) FROM Todo t JOIN t.genre b where t.id = :id") 
    List<Sample> findTitleById(@Param("id") Long id);

    @Query("SELECT t.title FROM Todo t where t.id = :id") 
    List<String> findTitleById(@Param("id") Long id);

    Todo findById(Long id);

    Optional<Todo> findById(Long id);
}

那么第一种方法可以吗? 我知道它有效-但这是不好的做法吗?

3 个答案:

答案 0 :(得分:1)

“存储库”模式应该可以通过从方法名称自动生成许多标准查询来为您提供帮助,但是,如果要创建更复杂的查询,可以使用@Query或完全写出该方法。 / p>

这是一个很好的实践,毕竟这就是@Query注释的作用。

答案 1 :(得分:1)

这是一种很好的做法。尽管我认为这是值得注意的,但是如果查询的时间更长,例如用于报告/多联接查询,我更喜欢将SQL本身外部化到单独的.sql文件中,并实现方法并导入sql。通常,这可以使用IDE插件来简化SQL的编辑,并且通常还可以使查询更易于操作,例如,出于性能原因,将其复制和粘贴到真实DB中以手动测试或解释该查询。您仍然可以通过定义结果集以pojo或pojo列表的形式获得结果。

答案 2 :(得分:0)

如果您已加入查询,那么最好使用它,并使查询更易于操作。

下面是从数据库获取数据的另一种方法。

键和值对: 您还可以将数据作为“键和值”对获取,为此您必须进行如下查询:

@Query("SELECT new com.example.Sample(t.title AS title , b.author AS author) FROM Todo t where t.id = :id")
List<Sample> findTitleById(@Param("id") Long id);

然后您将得到如下响应:

[
  {
    "title ": "Something",
    "author": "ABC"
  },
  {
    "title ": "Something",
    "author": "XYZ"
  },
  ...
  ...
]

但是我不确定在这种情况下是否可以使用JOIN。