我是新手,尝试谷歌,但我无法解决我的查询。 请帮忙。
我正在尝试映射两个实体:我的 POJO 类 PersonC 中的 PersonA 和 Person
@Entity
class PersonA{
String sample_field;
}
@Entity
class Person{
String id;
String name;
}
以上两个是jpa的实体。
现在我想将它们合并到一个 pojo 类中。
class PersonC
{
Strind id;
String address;
}
尝试了下面的代码,但是当我尝试获取地址/外键字段时它不起作用。
@SqlResultSetMapping(name="PersonC",
classes = {
@ConstructorResult(targetClass = PersonC.class,
columns = {@ColumnResult(name="name")
, @ColumnResult(name="address")
)}
我应该在哪里定义 @SqlResultSetMapping ,为上面的哪个类? ) })
最佳答案
@SqlResultSetMapping
可以放置在任何 实体类中(不要注释 POJO - 它不会工作)。在 JPA 2.1 版中添加了使用 @ConstructorResult
映射到 POJO 类。与映射一起使用的 POJO 必须具有正确的构造函数。
All columns corresponding to arguments of the intended constructor must be specified using the columns element of the ConstructorResult annotation in the same order as that of the argument list of the constructor.
请引用以下示例和查询用法,并相应地解决您的问题。
@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
)必须与 @ColumnResult
中的名称匹配。
该示例针对 Ecliselink 2.5.1 进行了测试。
关于java - JPA-连接非实体类中的两个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25179180/