3

我有以下 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 的类似语法错误。

我究竟做错了什么?

4

2 回答 2

1

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 );
   }
}

...显然我没有证据表明上面的代码真的可以工作。我只验证它不会导致编译错误。

于 2008-09-15T20:37:09.337 回答
0

您的示例直接来自 API 文档,不幸的是,这些文档的介绍很糟糕。

您的注释应该放在某个类上,可能是您将在其中创建查询以使用结果集映射的类。然而,这个注解的放置位置实际上并不重要。您的 JPA 提供者实际上将维护所有这些映射的全局列表,因此无论您在哪里定义它,您都可以在任何地方使用它。

这是注释方法的一个缺点(与在 XML 中指定事物相反)。JPA 中的许多其他事物(即命名查询)都是以相同的方式定义的。它看起来好像在被定义的事物和它被注释的类之间存在某种联系,而实际上并非如此。

于 2008-09-15T20:51:21.270 回答