Hibernate标准projection.OneToMany。 嵌套的DTO
我会很高兴在嵌套子映射集合上使用投影的任何帮助。
代码显示了我想要实现的一切,特别是TestWrapper包含一些实体列表。 假设TestWrapper是我的DTO对象,正在积累其他对象。
我想从test3中获取名称并将其存储为仅包含该字段集的test3对象的列表。
开始让我们看看实体类,包装器和hibernate投影代码:
@Entity
public class Test {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
private String name;
@ManyToOne
Test2 test2;
@OneToMany(mappedBy = "test")
List<Test3> tests3;
public Test() {
}
public List<Test3> getTests3() {
return tests3;
}
public void setTests3(List<Test3> tests3) {
this.tests3 = tests3;
}
public Test(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Test2 getTest2() {
return test2;
}
public void setTest2(Test2 test2) {
this.test2 = test2;
}
}
@Entity
public class Test2 {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
private String name;
public Test2() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Entity
public class Test3 {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
private String name;
@ManyToOne
@JoinColumn(name="test_fk")
private Test test;
public Test3() {
}
public Test getTest() {
return test;
}
public void setTest(Test test) {
this.test = test;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
包装:
public class TestWrapper {
private Test test;
private String test2_name;
private List<Test3> tests3;
public TestWrapper() {
}
public TestWrapper(Test test, String test2_name) {
this.test = test;
this.test2_name = test2_name;
}
public List<Test3> getTests3() {
return tests3;
}
public void setTests3(List<Test3> tests3) {
this.tests3 = tests3;
}
public Test getTest() {
return test;
}
public void setTest(Test test) {
this.test = test;
}
public String getTest2_name() {
return test2_name;
}
public void setTest2_name(String test2_name) {
this.test2_name = test2_name;
}
}
和我的休眠标准预测:
public List<TestWrapper> getTestProjection() {
Session session = entityManager.unwrap(Session.class);
Criteria test = session.createCriteria(Test.class);
test.createAlias("test2", "test2", JoinType.LEFT_OUTER_JOIN);
test.createAlias("tests3","tests3",JoinType.LEFT_OUTER_JOIN);
test.setFetchMode("tests3", FetchMode.JOIN);
// Criteria test2 = test.createCriteria("test2");
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.property("id"));
projectionList.add(Projections.property("test2.name"));
projectionList.add(Projections.property("test3.name"));
test.setProjection(projectionList);
test.setResultTransformer(new
AliasToBeanResultTransformer(TestWrapper.class));
return test.list();
}
你不能这样做,你的查询不会返回Entites,而只是像正常的sql查询那样。
AliasToBeanResultTransformer仅根据列的别名将每行映射到DTO的实例。
所以你将不得不修改你的DTO,并给你的预测和别名, 或编写你自己的Transanformer来重新排列行
链接地址: http://www.djcxy.com/p/37113.html