java 如何在SpringBoot JPA中的@Query注解中传递整个查询作为变量(更具体地说是方法参数)?

hgc7kmma  于 2023-05-21  发布在  Java
关注(0)|答案(1)|浏览(298)

所以我想根据一些条件创建一个String,并将整个查询作为方法参数传递。现在我发现了SPeL和一个语法:

@Query(value = "#{#query}", nativeQuery = true)
List<User> findByQuery(@Param("query") String query);

但那东西给了我一个错误

Java.sql.SQLException: Statement.executeQuery() cannot issue statements that do not produce result sets

我传递的查询:

SELECT * FROM registration WHERE APPROVED='pending' ORDER BY RSID DESC LIMIT 5

尽管整个查询可以根据特定条件而改变。

kx7yvsdv

kx7yvsdv1#

好吧,我终于得到了答案。要在Sping Boot 中使用EntityManager类运行查询,您可以按照以下步骤操作:
1.使用@PersistenceContext annotation将EntityManager示例注入到类中:

@PersistenceContext
private EntityManager entityManager;

1.使用EntityManager示例的createQuery()方法创建查询对象。您可以将JPQL(Java持久性查询语言)查询字符串或原生SQL查询字符串作为参数传递:

Query query = entityManager.createQuery("SELECT e FROM Employee e WHERE e.salary > :salary");
query.setParameter("salary", 50000);

1.如果你使用的是原生SQL查询,你可以使用createNativeQuery()方法:

Query query = entityManager.createNativeQuery("SELECT * FROM employees WHERE salary > :salary", Employee.class);
query.setParameter("salary", 50000);

1.在查询对象上调用getResultList()方法来执行查询并返回结果:

List<Employee> employees = query.getResultList();

1.然后,您可以迭代结果列表并根据需要处理它们:

for (Employee employee : employees) {
    // process each employee object
}

请注意,您应该始终使用参数化查询来防止SQL注入攻击。EntityManager类同时支持JPQL和原生SQL查询,但推荐使用JPQL,因为它独立于数据库并提供更好的类型安全性。

相关问题