Java 8 Spring Data JPA 参数绑定

Posted

技术标签:

【中文标题】Java 8 Spring Data JPA 参数绑定【英文标题】:Java 8 Spring Data JPA Parameter binding 【发布时间】:2015-02-28 07:07:37 【问题描述】:

在我的@Repository 接口中,我使用包含参数(addressType)的JPQL @Query 创建了自定义查找方法。

from Address a where a.addressType = :addressType

在方法中我没有在参数上指定@Param("addressType")。所以我得到了

java.lang.IllegalArgumentException:参数绑定的名称不能为空或空!对于命名参数,您需要在 Java 版本 上使用 @Param 查询方法参数

好的,这很清楚,但我使用的是 Java 8。那么 Java 8 有什么特别之处呢?

【问题讨论】:

天哪,您在 JPQL 查询中省略了“SELECT a”,所以它现在是非法的。 【参考方案1】:

@JB Nizet 给出的答案是正确的,但我只是想指出在使用 Eclipse 时为 Java 8 编译器添加 -parameters 标志的方法。这是在窗口 -> 首选项中:

Maven 还允许在 pom 本身中添加标志:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.5.1</version>
    <configuration>
        <compilerArgs>
            <arg>-verbose</arg>
            <arg>-parameters</arg>
        </compilerArgs>
    </configuration>
</plugin>

在使用 IDEA IntelliJ 时为 Java 8 编译器添加参数标志

文件 > 设置 > 构建、执行、部署 > 编译器 > Java 编译器

【讨论】:

这个是依赖还是下载了jar文件? 这是一个maven插件@Deva 那么,当我创建war文件时,这会增加我的项目大小吗?【参考方案2】:

在 Java 8 中,您可以使用反射来访问方法的参数名称。这使得 @Param 注释变得不必要了,因为 Spring 可以从方法参数的名称中推断出 JPQL 参数的名称。

但您需要在编译器中使用-parameters 标志才能获得该信息。

见http://docs.oracle.com/javase/tutorial/reflect/member/methodparameterreflection.html

【讨论】:

感谢您的回答。但我使用的是 Java8,SpringData 仍然要求我提供 @Param 注释。 您是否按照我链接到的页面中的说明使用 -parameters 选项编译了您的类? 不,我没有尝试过,我决定坚持使用@Param 注释,因为如果没有特殊的编译配置,代码将无法工作。但是,您的评论解释了您在主要答案中的意思。谢谢!【参考方案3】:

JB Nizet 和 Xtreme Biker 的回答都是正确的。我只想补充一点,如果您使用 Spring Boot,spring-boot-starter-parent(Gradle 或 Maven)已经为您添加了 -parameters 编译器标志:

plugin 
    delegate.groupId('org.apache.maven.plugins')
    delegate.artifactId('maven-compiler-plugin')
    configuration 
        delegate.parameters('true')
    

【讨论】:

以上是关于Java 8 Spring Data JPA 参数绑定的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 最佳实践Spring Data JPA 操作 MySQL 8

[SpringBoot] Spring BootSpring Data JPA 操作 MySQL 8

[SpringBoot] Spring BootSpring Data JPA 操作 MySQL 8

请教关于Spring Data JPA动态查询参数的问题

Spring Data Jpa

Spring Data JPA:InvalidDataAccessApiUsageException:参数值 [web] 与预期类型不匹配 [java.util.Collection (n/a)];