我正在使用Spring Data JPA进行一个项目,我在数据库中有一个表my_query。
我想创建一个以字符串作为参数的方法,然后在数据库中将其作为查询执行。
方法:
executeMyQuery(queryString)
举个例子当我通过
queryString= "SELECT * FROM my_query"
那么它应该在数据库级别运行该查询。
存储库类如下所示。
public interface MyQueryRepository extends JpaRepository<MyQuery, Long>{
public MyQuery findById(long id);
@Modifying(clearAutomatically = true)
@Transactional
@Query(value = "?1", nativeQuery = true)
public void executeMyQuery(String query);
}
然而,它并没有像我预期的那样工作。它给出了以下错误。
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''select * from my_query;'' at line 1
有没有其他的方法,我可以达到这个目标?
6条答案
按热度按时间vjrehmav1#
其中唯一可以参数化的部分是
WHERE
子句中使用的值。请考虑官方文档中的以下示例:wlsrxk512#
使用EntityManager可以实现这一点。
假设您的实体类如下所示:
您的查询是"选择id,name from users where roll_no = 1001"。
这里查询将返回一个带有id和name列的对象。你的Response类如下所示:
您的Response类类似于:
在这里,UserObject构造函数将获取一个对象数组,并使用该对象设置数据。
您的查询执行函数如下:
在这里你必须导入以下软件包:
现在你的主类要调用这个函数了,先得到EntityManager,调用这个
getUserByRoll(EntityManager entityManager,String rollNo)
函数,调用过程如下:通过以下方式获得
EntityManager
:现在这个userObject中有了数据。
query.getSingleResult()
返回对象数组,查询列位置需要维护列位置和数据类型。查询返回一个数组,它是[0]--〉id和1-〉name。
更多信息请访问this thread。
shstlldc3#
对于这个没有特殊的支持,但是你可以创建一个带有
String
参数的定制方法,在你的实现中注入EntityManager
并执行它。可能有用的链接:
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.custom-implementations
How to access entity manager with spring boot and spring data
注意:如果您尝试做的是一个好主意,我会重新考虑,因为它会将存储库的实现细节渗透到应用程序的其余部分。
jjjwad0x4#
如果要添加自定义查询,应该添加
@Param
这查询将选择唯一的记录与匹配
name
.这将工作zfciruhq5#
谢谢你@ilya。有没有一种替代方法可以使用SpringDataJPA来完成这个任务?没有@Query注解?
我只想处理这一部分。是的,有一种方法可以不使用@query注解来处理它。您需要的是从实现JPA存储库示例的接口定义一个派生查询。
然后,从存储库示例中,您将看到允许对数据库执行CRUD操作的所有方法,例如
有了这些方法,spring data将理解你试图归档的内容,并相应地实现它们。
还要记住,基本的CRUD操作是从基类定义中提供的,您不需要重新定义它们。例如,这是由spring定义的JPARepository类,因此扩展它可以为您提供所有方法。
有关更多最新信息,请查看https://docs.spring.io/spring-data/jpa/docs/current/reference/html/上的文档
xzlaal3s6#
根据@jelies的回答,我使用以下方法
您可以为自定义方法创建另一个接口(* 如MyQueryCustom*),然后按如下所示实现它。
这将执行自定义查询。