【发布时间】:2020-04-07 21:44:23
【问题描述】:
我需要通过加入 3 个不同的表来获取 6 列。我已在实体类之上将它们声明为 NamedNativequery,并且我使用了 JPA 的创建命名查询方法。当我尝试获取结果集时,我得到的是数组对象列表,而不是 POJO 类型的对象列表。为了将结果集映射到外部 POJO,我应该定义任何外部映射吗?
【问题讨论】:
标签: java spring hibernate jpa spring-data-jpa
我需要通过加入 3 个不同的表来获取 6 列。我已在实体类之上将它们声明为 NamedNativequery,并且我使用了 JPA 的创建命名查询方法。当我尝试获取结果集时,我得到的是数组对象列表,而不是 POJO 类型的对象列表。为了将结果集映射到外部 POJO,我应该定义任何外部映射吗?
【问题讨论】:
标签: java spring hibernate jpa spring-data-jpa
你当然可以。这应该会有所帮助:
@NamedNativeQuery(query = "SELECT t1.col1, t2.col2 FROM t1 JOIN t2 ON ...", name = "MyNamedQuery", resultSetMapping = "MyPojoMapper")
@SqlResultSetMapping(name = "MyPojoMapper", classes = @ConstructorResult(
targetClass = MyPojo.class,
columns = {
@ColumnResult(name = "col1", type = String.class),
@ColumnResult(name = "cols", type = String.class)
}))
然后这样使用它:
NativeQuery query = session.getNamedNativeQuery("MyNamedQuery");
MyPojo result = (MyPojo) query.getSingleResult();
【讨论】:
您可以使用投影来指定要获取哪些属性
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections
或者直接用JPQL获取:
@Repository
public class CustomRepositoryImpl {
@Autowired
private EntityManager entityManager;
public List<Dto> find() {
var query = "SELECT new Dto(
x.Field1,
y.Field2,
z.Field3,
...)
FROM XxxEntity x
LEFT JOIN YyyEntity y
LEFT JOIN ZzzEntity z"
var jpqlQuery = entityManager.createQuery(query);
return jpqlQuery.getResultList();
}
}
public class Dto {
// Must have parameterized constructor with all fields what used in Repository
public Dto(int field1, String field2, String field3, ...) {
}
}
【讨论】: