DTO 投影中可空子实体的 criteriaBuilder.construct() select 属性

criteriaBuilder.construct() select property of nullable child entity in DTO Projection

在 XyzEntity 中,用户字段包含空值和非空值

(此处root.get(XyzEntity_.user)可以为空)

代码 1:

criteriaQuery.select(criteriaBuilder.construct(XyzStatusDTO.class, root.get(XyzEntity_.ID), 
                root.get(XyzEntity_.user).get(UserEntity_.ID),
                root.get(XyzEntity_.user).get(UserEntity_.EMAIL)
           ));

代码 2:

 criteriaQuery.select(criteriaBuilder.construct(XyzStatusDTO.class, root.get(XyzEntity_.ID), 
                root.get(XyzEntity_.user).get(UserEntity_.ID) 
           ));

代码 3:

 criteriaQuery.select(criteriaBuilder.construct(XyzStatusDTO.class, root.get(XyzEntity_.ID) 
           ));

代码 1 returns 12 条记录(仅当用户不为空时)而代码 2 和代码 3 returns 300 个结果(包括空用户)。

任何建议,我可以在哪里放置条件语句,比如用户是否为 null 或 not-null)。因此,如果用户为空,值 id 用户 ID 和电子邮件将为空,而不是跳过结果。

你需要的是左连接

      Join<XyzEntity, UserEntity> userEntityJoin = root.join("user", JoinType.LEFT);
      criteriaQuery.select(criteriaBuilder.construct(XyzStatusDTO.class, root.get(XyzEntity_.ID), 
            userEntityJoin.get(UserEntity_.ID),
            userEntityJoin.get(UserEntity_.EMAIL)
       ));