使用Spring DATA JPA创建自定义查询?

B37*_*378 16 mysql sql spring spring-data spring-data-jpa

我正在使用Spring Data JPA开展项目.我在数据库中有一个表作为my_query.

我想创建一个方法,该方法将字符串作为参数,然后在数据库中将其作为查询执行.

方法:

executeMyQuery(queryString)
Run Code Online (Sandbox Code Playgroud)

例如,当我通过

queryString= "SELECT * FROM my_query"
Run Code Online (Sandbox Code Playgroud)

那么它应该在DB级别运行该查询.

存储库类如下.

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);

}
Run Code Online (Sandbox Code Playgroud)

但是,它没有像我预期的那样工作.它给出以下错误.

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
Run Code Online (Sandbox Code Playgroud)

还有其他办法,我可以实现这个目标.提前致谢

ily*_*lya 24

不幸的是,你的方法不起作用.如果使用WHERE注释,则按JPA或本机表示法提供一个正确的具体查询.

您可以参数化的唯一部分是WHERE子句中使用的值.从官方文档中考虑此示例:

public interface UserRepository extends JpaRepository<User, Long> {
  @Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)
  User findByEmailAddress(String emailAddress);
}
Run Code Online (Sandbox Code Playgroud)

  • @benji如果您确实需要这样的行为,那么您需要获取 EntityManager 并直接使用它运行查询。作为参考,请参阅此答案:http://stackoverflow.com/a/15341601/187241。但之前要三思而后行。如果您在很多地方都需要这个库,Spring Data 可能不适合您。它的主要思想是向您隐藏查询,并让您稍微调整它们,例如使用“@Query”注释。 (3认同)