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)
));
在 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)
));