【发布时间】:2019-09-02 05:55:34
【问题描述】:
那么,有什么方法可以从Repository接口执行原生SQL查询吗?
是的,我知道@Query 注释,但是如何执行可以在运行时更改的查询?喜欢JDBCexecuteQuery() 方法?
【问题讨论】:
-
看看
JdbcTemplate类,它是 Spring 中主要的 JDBC 集成点之一。
标签: java mysql spring jdbc nativequery
那么,有什么方法可以从Repository接口执行原生SQL查询吗?
是的,我知道@Query 注释,但是如何执行可以在运行时更改的查询?喜欢JDBCexecuteQuery() 方法?
【问题讨论】:
JdbcTemplate 类,它是 Spring 中主要的 JDBC 集成点之一。
标签: java mysql spring jdbc nativequery
您可以将规范与您的 JpaRepository 一起使用,以在运行时构建动态查询。
将 JpaSpecificationExecutor 添加到您的 JpaRepository 接口...
@Repository
public interface MyRepo extends JpaRepository<MyEntity, Long>, JpaSpecificationExecutor {
}
然后使用返回规范的静态方法创建一个类......
public class MyEntitySearchSpec {
private MyEntitySearchSpec() {
// Remove this private constructor if need to add public non-static methods.
}
public static Specification<MyEntity> myEntitySearch(
final mysearchCriteria MySearchCriteria) {
return (root, query, cb) -> {
List<Predicate> predicates = new ArrayList<>();
if (mysearchCriteria.isOnlyActive()) {
predicates.add(cb.isNull(root.get("closeDate")));
}
if (mysearchCriteria.getCaseNumber() != null) {
predicates.add(cb.equal(root.get("caseNumber"),
mysearchCriteria.getCaseNumber()));
}
return cb.and(predicates.toArray(new Predicate[] {}));
};
}
}
你可以这样称呼...
myRepo.findAll(myEntitySearch(mysearchCriteria));
【讨论】:
如果您的意思是使用 Spring Data,您可以执行以下操作:
@Query(value = "SELECT p from Person p where r.name = :person_name")
Optional<Person> findPersonByName(@Param("person_name") String personName);
您也可以使用本机查询:
@Query(value = "select * from person p where r.name = :person_name")", nativeQuery = true)
enter code here
【讨论】:
实现JpaRepository并使用
@PersistenceContext
private EntityManager em;
使用 Java 的全部功能创建 query 类型的 string 然后:
final Query emQuery = em.createNativeQuery(query);
final List<Object[]> resultList = emQuery.getResultList();
【讨论】: