【问题标题】:Where to place @SqlResultSetMapping in case of @ConstructorResult在 @ConstructorResult 的情况下放置 @SqlResultSetMapping 的位置
【发布时间】:2015-06-20 13:47:08
【问题描述】:

我正在尝试使用 jpa 的 entityManager 的 createNativeQuery 方法映射非实体 pojo。通过使用类似的东西

@SqlResultSetMapping(name="ResultMapping", 
classes={
@ConstructorResult(
     targetClass=Employee.class,
       columns={
          @ColumnResult(name="empID", type=Long.class),
          @ColumnResult(name="empName", type=String.class),
          }
   )
}
)
public class Loader{
 private EntityManager em;

 public void load(){

   Query query = em.createNativeQuery("select empID, empName from employee",  "ResultMapping");
   List<Employee> = query.getResultList();
 }

}

public class Employee{

 private long empID;
 private String empName;
 public Employee(long empid, String empname)
 {
     this.empID = empid;
     this.empName = empname;
 }
}

我收到unknown SqlResultSetMapping ResultMapping 错误 我应该把 SqlResultSetMapping 放在哪里,以便 entityManager 能够识别它?

【问题讨论】:

    标签: jpa mapping entitymanager


    【解决方案1】:

    我应该将 SqlResultSetMapping 放在哪里,以便 entityManager 能够识别它?

    据我所知,它因持久性提供程序而异:

    • EclipseLink:将其放在类路径中的任何类中
    • Hibernate:把它放在任何用@Entity注解的类中;事实上,当我把它放在别处时,我能够重现错误:

      org.hibernate.MappingException: Unknown SqlResultSetMapping [ResultMapping]
      

    使用 EclipseLink 2.5.2、Hibernate 4.3.8.Final 测试


    一般来说,为了使您的应用程序可跨 JPA 提供程序移植,最好将 SqlResultSetMapping 放在任何实体类中。

    【讨论】:

    • JPA 是规范,而 EclipseLink、Hibernate、OpenJPA、DataNucleus 等是它的实现(持久性提供者)。没有“纯 JPA”之类的东西,因为规范并没有精确说明给定的持久性提供者在这种特殊情况下应该如何表现,尽管它可能会在将来指定。
    • put it at any class annotated with @Entity 是否有任何广泛使用/已知的约定将它们放在某个地方。我有一堆查询,我不想用这些污染实体。此外,我的查询是一些报告用例查询,与任何单一查询都没有如此紧密的联系。
    • @krozaine 如果你不想用注释块污染你的实体,你可以在带有sql-result-set-mapping块的XML映射文件中定义它们。
    • 这是有道理的,因为您正在映射从数据库中检索到的东西
    猜你喜欢
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多