Java EE SqlResultSetMapping 语法
题
我有以下 Java 6 代码:
Query q = em.createNativeQuery(
"select T.* " +
"from Trip T join Itinerary I on (T.itinerary_id=I.id) " +
"where I.launchDate between :start and :end " +
"or ADDDATE(I.launchDate, I.equipmentPullDayOfTrip) between :start and :end",
"TripResults" );
q.setParameter( "start", range.getStart(), TemporalType.DATE );
q.setParameter( "end", range.getEnd(), TemporalType.DATE );
@SqlResultSetMapping( name="TripResults",
entities={
@EntityResult( entityClass=TripEntity.class ),
@EntityResult( entityClass=CommercialTripEntity.class )
}
)
我在最后一个右括号处收到语法错误。Eclipse 给出:“插入 EnumBody 以完成块语句”和“插入枚举标识符以完成 EnumHeaderName”。来自 javac 的类似语法错误。
我究竟做错了什么?
解决方案
Hibernate 注释文档(http://www.hibernate.org/hib_docs/annotations/reference/en/html_single/)建议这应该是类级注释,而不是在代码中内联发生。事实上,当我将该代码粘贴到 IDE 中并移动它时,当注释内联时会出现编译错误,但当我将其放在类声明上方时,编译错误就会消失:
@SqlResultSetMapping( name="TripResults",
entities={
@EntityResult( entityClass=TripEntity.class ),
@EntityResult( entityClass=CommercialTripEntity.class )
}
)
public class Foo {
public void bogus() {
Query q = em.createNativeQuery(
"select T.* " +
"from Trip T join Itinerary I on (T.itinerary_id=I.id) " +
"where I.launchDate between :start and :end " +
"or ADDDATE(I.launchDate, I.equipmentPullDayOfTrip) between :start and :end",
"TripResults" );
q.setParameter( "start", range.getStart(), TemporalType.DATE );
q.setParameter( "end", range.getEnd(), TemporalType.DATE );
}
}
...显然我没有证据表明上面的代码实际上可以工作。我只是验证了它不会导致编译错误。
其他提示
您的示例直接来自 API 文档,不幸的是,这些文档的介绍很差。
您的注释应该放在某个类上,可能是您将在其中创建查询以使用结果集映射的类。然而,实际上这个注释放在哪里并不重要。您的 JPA 提供程序实际上将维护所有这些映射的全局列表,因此无论您在何处定义它,您都可以在任何地方使用它。
这是注释方法的缺点(与在 XML 中指定事物相反)。JPA 中的许多其他事物(即命名查询)也以同样的方式定义。这使得所定义的事物和注释它的类之间似乎存在某种联系,但实际上并非如此。
不隶属于 StackOverflow