@sqlResultSetMapping
可以放在任何实体类中(不要为POJO注释-它不起作用)。@ConstructorResult
在JPA 2.1版中添加了映射到POJO类。与映射一起使用的POJO必须具有正确的构造函数。
必须使用ConstructorResult
批注中的columns
元素以与构造函数的参数列表相同的顺序指定与预期构造函数的参数对应的所有列。
@Entity
public class Address {
@Id int id;
String street;
}
@sqlResultSetMapping(name="PersonDTOMapping",
classes = {
@ConstructorResult(targetClass = PersonDTO.class,
columns = {@ColumnResult(name="name"), @ColumnResult(name="street")}
)}
)
@Entity
public class Person {
@Id int id;
String name;
Address address;
}
public class PersonDTO {
String name;
String street;
public PersonDTO(String name, String street) {
this.name = name;
this.street = street;
}
}
// usage
Query query = em.createNativeQuery(
"SELECT p.name AS name, a.street AS street FROM Person p, Address a WHERE p.address_id=a.id",
"PersonDTOMapping");
List<PersonDTO> result = query.getResultList();
请注意,别名(AS name和AS street)必须与@ColumnResults 中的名称匹配。该示例已针对Ecliselink 2.5.1进行了测试。