简体   繁体   English

Hibernate 标准投影。OneToMany。 嵌套 DTO

[英]Hibernate criteria projection.OneToMany. Nested DTOs

I would be glad for any help with using projections on nested child mapped collections.我很高兴在嵌套子映射集合上使用投影的任何帮助。
The code shows everything I want to achieve especially TestWrapper contains list of some entities.代码显示了我想要实现的一切,尤其是 TestWrapper 包含一些实体的列表。 Let's assume that TestWrapper is my DTO object accumulating other.让我们假设 TestWrapper 是我的 DTO 对象累积其他。
I want to get from test3 for example name and store it as list of test3 objects containg only that field set.我想从 test3 获取例如名称并将其存储为仅包含该字段集的 test3 对象列表。
At beginning let's look at entity classes,wrapper and hibernate projection code :首先让我们看看实体类、包装器和休眠投影代码:

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

wrapper:包装器:

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;
}
}

And my hibernate criteria projection:我的休眠标准投影:

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

You can not do that, your query is not returning Entites, but just columns like a regular sql query.你不能那样做,你的查询不返回实体,而只是像常规 sql 查询一样的列。

The AliasToBeanResultTransformer just map each rows to an instance of DTO based on the alias of the column. AliasToBeanResultTransformer 只是根据列的别名将每一行映射到一个 DTO 实例。

So you will have to modify your DTO and give and alias to your projections OR write your own Transanformer to regroup row因此,您将不得不修改您的 DTO 并为您的投影提供别名编写您自己的 Transanformer 以重新组合行

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM