【问题标题】:QueryDsl: null entity from oneToMany association with projection beanQueryDsl:来自与投影 bean 的 oneToMany 关联的空实体
【发布时间】:2016-03-01 18:56:17
【问题描述】:

所以我想在我的项目中使用投影 bean 来优化加载时间(以避免获得无用的数据......)。

我有这两个实体:Parent -----

在我的数据库中,我有:

  • parent1 与 child1 和 child2
  • parent2 没有孩子

我想在一个请求中获得父母和孩子,所以首先我这样做了:

final JPAQueryBase<?> query = createQuery();

final QParent qParent = QParent.parent;
final QChild qChild = QChild.child;

Map<Long, Parent> transform = query.from(qParent)
        .leftJoin(qParent.children, qChild)
        .transform(GroupBy.groupBy(qParent.id)
                .as(Projections.bean(Parent.class,
                        qParent.id,
                        qParent.name,
                        GroupBy.set(qChild).as(qParent.children))));

final List<Parent> parents = new ArrayList<Parent>(transform.values());

它就像一个魅力,结果是这样的:

[
    Parent: {
        id: 1,
        name: "parent1",
        children: [
            Children: {
                id: 1,
                name: "child1",
                otherAttr: //loaded
            },
            Children: {
                id: 2,
                name: "child2",
                otherAttr: //loaded
            }
        ],
        otherAttr: null
    },
    Parent: {
        id: 2,
        name: "parent2",
        children: [], //size: 0
        otherAttr: null
    }
]

但我不想从子实体加载“其他属性”。所以我用子实体的投影豆做了这个查询:

final JPAQueryBase<?> query = createQuery();

final QParent qParent = QParent.parent;
final QChild qChild = QChild.child;

Map<Long, Parent> transform = query.from(qParent)
        .leftJoin(qParent.children, qChild)
        .transform(GroupBy.groupBy(qParent.id)
                .as(Projections.bean(Parent.class,
                        qParent.id,
                        qParent.name,
                        GroupBy.set(Projections.bean(Child.class,
                                qChild.id,
                                qChild.name))
                                .as(qParent.children))));

final List<Parent> parents = new ArrayList<Parent>(transform.values());

通过这个查询,我可以完全控制要选择的属性。但是当父母没有孩子时,奇怪的事情发生了:所有属性都设置为 null 的 Child 对象出现在子列表中,如下所示:

[
    Parent: {
        id: 1,
        name: "parent1",
        children: [
            Children: {
                id: 1,
                name: "child1",
                otherAttr: null
            },
            Children: {
                id: 2,
                name: "child2",
                otherAttr: null
            }
        ],
        otherAttr: null
    },
    Parent: {
        id: 2,
        name: "parent2",
        children: [ //size: 1
            Children: {
                    id: null,
                    name: null,
                    otherAttr: null
                }
        ],
        otherAttr: null
    }
]

这是一个错误吗?如果不是我做错了什么??

【问题讨论】:

    标签: hibernate jpa javabeans querydsl


    【解决方案1】:

    我自己也遇到过这个问题,我将GitHub issue 1677的答案放在这里以供将来参考。个别投影必须标有skipNulls()

    Map<Long, Parent> transform = query.from(qParent)
        .leftJoin(qParent.children, qChild)
        .transform(GroupBy.groupBy(qParent.id)
                .as(Projections.bean(Parent.class,
                        qParent.id,
                        qParent.name,
                        GroupBy.list(Projections.bean(Child.class,
                                qChild.id,
                                qChild.name,
                                Projections.bean(qSubChild.class,
                                        qSubChild.id,
                                        qSubChild.name).skipNulls()
                                        .as(qChild.subChild)).skipNulls())
                                .as(qParent.children))));
    

    【讨论】:

      猜你喜欢
      • 2017-03-08
      • 2015-02-26
      • 1970-01-01
      • 2022-01-08
      • 2020-07-05
      • 2013-12-29
      • 2010-09-13
      • 2020-09-05
      • 1970-01-01
      相关资源
      最近更新 更多