gpt4 book ai didi

hibernate - Spring JPA DTO 投影和处理具有空值的嵌套投影

转载 作者:行者123 更新时间:2023-12-04 14:56:09 26 4
gpt4 key购买 nike

我正在使用基于类的投影和构造函数表达式。这是我工作的示例代码

@Query("select new com.core.data.category.CategoryDto(c.id,c.code,c.externalCode,c.seoMeta, c.createdAt, c.updatedAt,c.parent.code) FROM Category c where c.code = :code")
CategoryDto findCategoryByCode(@Param("code") String code);

这就是我的 CategoryDto 的样子:

public class CategoryDto implements Serializable {

private Long id;
private String code;
private String externalCode;
private SEOMeta seoMeta;
private CategoryDto parent;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
Map<String, LocCategoryDto> translation;

//constructor based on the requirement
}

除了嵌套对象的属性为 null 的情况外,这似乎工作正常。在我的例子中,父属性可以是 null 以防这是一个根类别,但它似乎使用 c.parent.code 导致了问题并且整个对象都在 。有人可以帮我解决以下问题

  1. 有没有办法使用相同的构造函数表达式来处理这种情况?我试图查看文档,但没有找到详细信息。
  2. 我认为其他选项可能是使用 ResultTransformer(它将我的代码绑定(bind)到特定的 JPA),但我没有找到任何关于如何将它与 Spring JPA 一起使用的信息。

更新我什至尝试了使用 CASE 选项的选项,但似乎这对我也不起作用,因为我仍然得到空实体(虽然数据在数据库中可用)。这是我尝试过的更新代码

@Query(value = "select new com.core.data.category.CategoryDto(c.id,c.code,c.externalCode,c.seoMeta, c.createdAt, c.updatedAt, " +
"CASE " +
"WHEN c.parent is NULL " +
"THEN NULL " +
"ELSE c.parent.code " +
"END ) " +
"FROM Category c where c.code = :code")
CategoryDto findCategoryByCode(@Param("code") String code);

编辑 2我什至也尝试过加入,但这似乎也不起作用。

更新:我犯了一个愚蠢的错误。使用简单连接而不是左连接导致了这个问题。

最佳答案

尝试使用左连接

@Query("select new com.core.data.category.CategoryDto(c.id,c.code,c.externalCode,c.seoMeta, c.createdAt, c.updatedAt,parent.code) FROM Category c left join c.parent as parent where c.code = :code")
CategoryDto findCategoryByCode(@Param("code") String code);

关于hibernate - Spring JPA DTO 投影和处理具有空值的嵌套投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67943340/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com