[英]How execute native SQL queries using Spring in runtime in Java?
So, are there any methods to execute native SQL queries from Repository
interface? 那么,有什么方法可以从
Repository
接口执行本机SQL查询吗?
Yes, I know about @Query
annotation, but how to execute queries that can be changed in runtime? 是的,我知道
@Query
注释,但是如何执行可以在运行时更改的查询? Like in JDBC
executeQuery()
method? 像
JDBC
executeQuery()
方法一样?
Implement JpaRepository
and use 实施
JpaRepository
并使用
@PersistenceContext
private EntityManager em;
to use the full power of Java to create query
of type string
and then: 使用Java的全部功能来创建
string
类型的query
,然后:
final Query emQuery = em.createNativeQuery(query);
final List<Object[]> resultList = emQuery.getResultList();
If you mean using Spring Data you could do something like : 如果您打算使用Spring Data,则可以执行以下操作:
@Query(value = "SELECT p from Person p where r.name = :person_name")
Optional<Person> findPersonByName(@Param("person_name") String personName);
You can use native query as well : 您也可以使用本机查询:
@Query(value = "select * from person p where r.name = :person_name")", nativeQuery = true)
enter code here
You can use a Specification with your JpaRepository to make a dynamic query built at runtime. 您可以将规范与JpaRepository一起使用,以在运行时构建动态查询。
Add JpaSpecificationExecutor to your JpaRepository interface... 将JpaSpecificationExecutor添加到您的JpaRepository接口...
@Repository
public interface MyRepo extends JpaRepository<MyEntity, Long>, JpaSpecificationExecutor {
}
Then make a class with a static method that returns a Specification.... 然后使用返回规范的静态方法制作一个类。
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[] {}));
};
}
}
The you can call like this... 您可以像这样致电...
myRepo.findAll(myEntitySearch(mysearchCriteria));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.