Java 8 Spring Data JPA 参数绑定

19
在我的 @Repository 接口中,我创建了一个带有 JPQL @Query 的自定义查询方法,其中包含参数(addressType)。 from Address a where a.addressType = :addressType 在该方法中,我没有在参数上指定 @Param("addressType")。所以我得到了一个java.lang.IllegalArgumentException异常:“参数绑定的名称不能为空!对于命名参数,您需要在Java版本<8的查询方法参数上使用@Param。”
好的,这很清楚,但我正在使用Java 8。那么Java 8在这里有什么特殊之处?

哦,亲爱的,你在JPQL查询中省略了"SELECT a",所以现在是非法的。 - Neil Stockton
3个回答

16

@JB Nizet给出的答案是正确的,但我想指出在Eclipse中使用Java 8编译器时如何添加-parameters标志的方法。这是在Window -> Preferences中:

Preferences setting

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编译器

Java编译器设置


这是依赖项还是需要下载任何JAR文件? - Deva
这是一个Maven插件@Deva。 - Aritz
那么,当我创建war文件时,这会增加我的项目大小吗? - Deva

13

2
谢谢你的回答。但是我正在使用Java8和SpringData,它仍然要求我使用@Param注释。 - Andrii Karaivanskyi
3
你是否已经按照我提供的链接中所解释的方式,使用了-parameters选项编译你的类? - JB Nizet
不,我没有尝试过那个,因为代码在没有特殊编译配置的情况下无法工作,所以我决定坚持使用 @Param 注释。但是你的评论解释了你在主要答案中的意思。谢谢! - Andrii Karaivanskyi

0
JB Nizet和Xtreme Biker的回答都是正确的。我只想补充一点,如果你使用Spring Boot,-parameters编译器标志已经由spring-boot-starter-parent(Gradle或Maven)为您添加:
plugin {
    delegate.groupId('org.apache.maven.plugins')
    delegate.artifactId('maven-compiler-plugin')
    configuration {
        delegate.parameters('true')
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接