@Query注释与自定义类Spring Boot Java

时间:2018-11-19 12:41:31

标签: java sql spring spring-boot spring-data-jpa

针对JPA用户的问题,是否有以下可能?

@Query(value = "SELECT * FROM Users u WHERE u.status = :sampleClass.status", 
  nativeQuery = true)
List<SampleClass> findBySampleClass(SampleClass sampleClass);

SampleClass批注中通知我尝试访问@Query的方式。无法解决此问题,而是去了Criteria并构建了我的老式查询。

3 个答案:

答案 0 :(得分:1)

您可以使用JPA文档中提到的方法:

    @Query(value = "SELECT * FROM Users u WHERE u.status = ?1",
 nativeQuery = true)
    List<SampleClass> findBySampleClass(String status);

有关更多选项,请参考官方文档:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#_native_queries

不确定为什么要尝试传递整个对象。您愿意解释吗?

答案 1 :(得分:1)

= 之间应该没有空格:,因此请将查询更改为以下一个。

SELECT * FROM Users u WHERE u.status =: sampleClass.status

还用您的数学名称findBySampleClass,您试图基于SampleClass进行查找,然后为什么只传递SampleClass的一个参数而不是对象?

请参见this,以保持清晰。

您还可以通过索引?1之类的参数来像下面一样使用。

@Query(value = "select id,name,roll_no from USER_INFO_TEST where rollNo = ?1", nativeQuery = true)
ArrayList<IUserProjection> findUserUsingRollNo(String rollNo);

引用:来自Spring Data JPA reference docs的引用。

另外,请参见this section,了解如何使用命名的本机查询。

答案 2 :(得分:1)

您无法尝试执行的操作是因为在本机查询中,您仅支持绑定直接变量,因此无法对对象进行奇特的访问。您可以通过使用JPQL或HQL(如果您将休眠用作ORM提供程序)来执行与尝试类似的操作。

但是在更高层次上存在问题。您正在调用方法findBySampleClass,正在传递SampleClass作为输入参数,并期望SampleClass作为输出。这意味着您将从语义的角度返回对象本身。这是可疑的。但是,进一步来说,您在实际的查询规范中正在做一些不同的事情。您正在使用传入的对象的status属性。这与方法名称应说明查询内容的约定不同。在这种情况下,正确(最自然)的方法是将status作为参数传递,将方法重命名为findBySampleClassStatusfindByStatus