在@ConstructorResult的情况下放置@SqlResultSetMapping的位置

Sha*_*til 8 mapping jpa entitymanager

我正在尝试使用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;
 }
}
Run Code Online (Sandbox Code Playgroud)

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

wyp*_*prz 11

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

据我所知,它与持久性提供程序不同:

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

    org.hibernate.MappingException: Unknown SqlResultSetMapping [ResultMapping]
    
    Run Code Online (Sandbox Code Playgroud)

使用EclipseLink 2.5.2,Hibernate 4.3.8.Final进行测试


通常,为了使您的应用程序可以跨JPA提供程序移植,最好将SqlResultSetMapping放在任何实体类中.

  • @krozaine 如果你不想用注释块污染你的实体,你可以使用“sql-result-set-mapping”块在 XML 映射文件中定义它们。 (3认同)