Java EE SqlResultSetMapping语法

时间:2020-03-05 18:54:25  来源:igfitidea点击:

我有以下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中的许多其他内容(即命名查询)都以相同的方式定义。它使看起来好像在被定义的事物与对其进行注释的类之间存在某种联系,而实际上却没有。