版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tangyaya8/article/details/83721007
背景:
在之前的演示中我们用占位符来传递参数,不论是JPQL还是用原生的SQL语句查询,我们都是这样传递参数的:
SELECT p FROM Person p WHERE p.firstName=?1 AND p.lastName=?2
这样传参的缺点是当你重构代码的时候你可能会忘记那个参数对应的字段在那个位置,尤其是参数数量过多的时候。这时候类似于MyBatis的基于注解的参数名传递参数的方式诞生了(ps:没有了解过是谁先谁后的,按照我的学习顺序吧)
JPA基于名称的参数传递
重构上面的代码
@Query("SELECT p FROM Person p WHERE p.firstName= :firstName AND p.lastName = :lastName")
Person getPersonWithNamedParameter(@Param("firstName") String firstName, @Param("lastName") String lastName);
基于名称的绑定参数比基于location的方式在参数多的时候好维护一点,你不用关心,形参和实参的位置,比如以下这样也是可以的:
@Query("SELECT p FROM Person p WHERE p.firstName= :firstName AND p.lastName = :lastName")
Person getPersonWithNamedParameter(@Param("lastName") String lastName, @Param("firstName") String firstName);
官网上还提供了一种不用写注解的方式,但是我没有调试成功,如果有小伙伴调试成功了欢迎讨论。
我贴以下我的例子:
不用@Param的方式需要Java8以上的环境和Maven配置参数:
JPQL:
@Query("SELECT p FROM Person p WHERE p.firstName= :firstName AND p.lastName = :lastName")
Person getPersonWithNamedParameter( String firstName, String lastName);
Maven插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
在Idea中的Run/Debug中配置:
配置:
运行:
SQL语句都是打印正确的,但是就是查询不出来结果。。