【问题标题】:Custom SQL queries and Spring Data JPA自定义 SQL 查询和 Spring Data JPA
【发布时间】:2019-03-10 21:43:50
【问题描述】:

如何在 Spring Data JPA 中编写自定义查询? 还有比以下更方便的方法吗?我以前是这样的:

public class TestCustomRepositoryImpl implements TestCustomRepository {

    @PersistenceContext
    private EntityManager entityManager;


    @Override
    public Double getValue(Long param) {
        // Simple SQL query for example.
        String queryString = "SELECT column_name1 FROM table_name1 " 
             + "WHERE column_name2 = " + param;
        Query query = entityManager.createNativeQuery(queryString);

        List resultList = query.getResultList();
        if (!resultList.isEmpty()) {
            Number value = (Number) resultList.get(0);
            if (value != null) {
                return value.doubleValue();
            }
        }

        return 0.0;
    }
}

然后我将自定义接口添加到我的 JPA 存储库:

public interface TestRepository extends JpaRepository<TestEntity, Long>, TestCustomRepository {

}

有没有更方便的方法?例如,我可以将 Spring Data 用于 CRUD 并使用 MyBatis 实现 TestCustomRepository 吗? 您如何实现自定义方法?

【问题讨论】:

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


    【解决方案1】:
    You can write the native query in the repository like this:
    
    1)
    @Query("SELECT t.column_name1 FROM table_name1 t WHERE t.column_name2 =:param")
    List<String> getValue(@Param("param") String param);
    
    OR
    
    2)@Query("SELECT t.column_name1 FROM table_name1 t WHERE t.column_name2 = 'param'", nativeQuery=true)
    List<String> getValue();
    
    Or you can use NamedQuery and add the query in the model only.
    for eg: 
    @Entity
    @Table(name = "table_name1", schema="db_name")
    @NamedQuery(name = "ENTITY.fetchParam",
            query = "SELECT t.column_name1 FROM table_name1 t WHERE t.column_name2 =:param "
    )
    public class Employee {
    }
    
    And have same method in the repository like:
    @Repository
    public interface TestRepository extends JpaRepository<Employee,Long>, TestRepositoryCustom {
    
        List<String> fetchParam(@Param("param") String param);
    }
    

    【讨论】:

    • 谢谢。我以前使用过这种方法,但后来出现了 DTO(不是 JPA 实体)和原始值(整数、双精度等)的问题。 1)如果我想要聚合数据(使用自定义查询搜索平均值、最大值、最小值、中值)并返回原始类型,我该如何实现? 2)如果我想使用自定义查询从数据库中的不同表中提取数据并将它们组合在一个 DTO 中,我该如何实现呢?这就是我在这里问这个问题的主要原因。 :)
    【解决方案2】:

    TestRepository 中,您可以通过SELECT NEW 使用DTO 并传递DTO 对象:

    @Query("SELECT NEW com.app.domain.EntityDTO(table.id, table.col2, table.col3)
    FROM Table table")
    public List<EntityDTO> findAll();
    

    在示例中,您的 DTO 必须有一个带有这 3 个参数的构造函数。

    如果你想选择属性,你可以简单地使用:

    @Query("SELECT table.id)
    FROM Table table")
    public List<Long> findAllIds();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-25
      • 2015-12-07
      • 2012-09-13
      • 1970-01-01
      • 2020-06-16
      • 2017-08-15
      • 1970-01-01
      • 2020-04-12
      相关资源
      最近更新 更多