2017-07-07 12 views
0

ネストされた子マッピングされたコレクションで投影を使用することについて助けてくださり、嬉しく思います。
コードには、達成したいことがすべて示されています。特に、TestWrapperにはいくつかのエンティティのリストが含まれています。 TestWrapperが私のDTOオブジェクトを他のものとして蓄積しているとしましょう。
私はtest3からexampleの名前を取得し、それをそのフィールドセットだけを含むtest3オブジェクトのリストとして保存したいと思います。冒頭
はのは、エンティティクラス、ラッパーを見て、投影コードを休止してみましょう:休止状態の基準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を変更して与えなければならないだろうとエイリアスOR

を再グループ化するために、独自のTransanformerを書きます