我有一个包信息类,它用于在Java 6/7中编译。但是在Java 8中,我收到编译错误:
错误:批注类型不适用于此类声明 @NamedNativeQueries({
错误:批注类型不适用于此类声明 @SqlResultSetMappings({*****
这是代码:
@NamedNativeQueries({
@NamedNativeQuery(name = "",
query = "",
resultSetMapping = "mapping"
),
NamedNativeQuery(
name = "",
query = "",
callable = true,
readOnly = false,
resultSetMapping = ""
)
})
@SqlResultSetMappings({
})
package abc.domain;
import javax.persistence.ColumnResult;
import javax.persistence.EntityResult;
import javax.persistence.FieldResult;
import javax.persistence.NamedNativeQueries;
import javax.persistence.NamedNativeQuery;
import javax.persistence.SqlResultSetMapping;
import javax.persistence.SqlResultSetMappings;
提前感谢您的帮助
编辑:其他评论更清楚地表明了这里出了什么问题;因此,这个答案的性质发生了一些变化。
听起来你从Hibernate自己的@NamedNativeQueries
和公司版本(你可以坚持在包上)切换到通用的javax持久性变体,它不能放在包上。
在尝试转换此代码时,必须已删除并重新生成导入。不要这样做 - 删除所有这些导入并用import org.hibernate.annotations.NamedNativeQueries
和朋友替换它们。
对于后代来说,原始答案仍然有效,但仅在专门针对javax.persistence.NamedNativeQueries
的上下文中。
你一定记错了;它没有也从来没有在java7上工作过(这是amedNativeQueries
的java7文档 - 注意它有一个@Target(value=TYPE)
标记,所以它不能放在一个包上,这就是文档的v7版本!
你把这些东西放在一个类型上,例如顶级类型。这意味着注释显示在顶部附近,但在包语句之后。鉴于您在package-info.java
文件中使用它们,它们根本无法出现在此处(并且永远不可能)。
SqlResultSetMappings
是一样的。
不知何故,javac7
实际上并没有检查这些注释的Target
条件。但是,这仅意味着您的代码从未工作过,即使它确实进行了编译。