2017-07-07 57 views
0

我很乐意在嵌套子映射集合上使用投影的任何帮助。
该代码显示了我想要实现的一切,特别是TestWrapper包含了一些实体列表。假设TestWrapper是我的DTO对象,正在积累其他对象。
我想从test3中获取名称并将其存储为仅包含该字段集的test3对象列表。
在开始让我们来看看实体类,包装和休眠投影代码:Hibernate标准projection.OneToMany。嵌套DTO

@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(); 
    } 

回答

0

你不能这样做,您的查询不会返回Entites,而只是像常规SQL查询那样的列。

AliasToBeanResultTransformer仅根据列的别名将每行映射到DTO的实例。

所以,你将不得不修改您的DTO,并给予和别名到您的预测写自己的Transanformer重新集结行