自定义SQL查询和Spring Data JPA

3

如何在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吗? 你如何实现自定义方法?

2个回答

4
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实体)和原始值(Integer、Double等)的问题。 1)如果我想要聚合数据(使用自定义查询搜索平均值、最大值、最小值、中位数)并返回原始类型,我该如何实现? 2)如果我想要从数据库中的不同表中提取数据,并将它们组合在一个单独的DTO中,我该如何实现? 这就是我在这里提出这个问题的主要原因。 :) - undefined

1
TestRepository中,你可以使用DTO来使用SELECT NEW并传递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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接