Spring 基于 JPA Class 的投影和嵌套投影
Spring JPA Class-based Projections and Nested projections
我正在尝试使用基于 Class 的投影来填充数据,但似乎 Spring JPA 不支持嵌套投影。这是我的实体 class:
public class Category extends BaseEntity<String> {
@Column(unique = true)
private String code;
private String externalCode;
@ManyToOne(cascade = CascadeType.ALL)
private Category parent;
..
}
这是相同的 DTO class:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CategoryDto implements BaseDto, Serializable {
private String code;
private String externalCode;
private CategoryDto parent;
..
}
我的CategoryRepository
@Query("select new com.easycart.core.data.category.CategoryDto(c.id,c.code,c.externalCode,c.seoMeta, c.createdAt, c.updatedAt,c.parent) FROM Category c where c.code = :code")
CategoryDto findCategoryByCode(String code);
我不能使用 c.parent
因为类型是 Category
而不是 CategoryDto
,而且我没有找到任何选项来使用嵌套投影来填充父级给定实体的信息。有人可以帮我解决以下问题吗?
- 有没有办法使用基于 class 的投影来实现此目的?
- 我是否需要回退到单独填写父信息的选项(在初始加载时我不需要很多父信息。)。
- 还有其他方法可以实现吗?我不想使用基于界面的投影作为初始测试,显示它与基于 class 的投影相比非常慢。
在 Spring Data JPA 中没有开箱即用的支持。
实现这一点的方法是使用 constructor expressions and ResultTransformer
我正在尝试使用基于 Class 的投影来填充数据,但似乎 Spring JPA 不支持嵌套投影。这是我的实体 class:
public class Category extends BaseEntity<String> {
@Column(unique = true)
private String code;
private String externalCode;
@ManyToOne(cascade = CascadeType.ALL)
private Category parent;
..
}
这是相同的 DTO class:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CategoryDto implements BaseDto, Serializable {
private String code;
private String externalCode;
private CategoryDto parent;
..
}
我的CategoryRepository
@Query("select new com.easycart.core.data.category.CategoryDto(c.id,c.code,c.externalCode,c.seoMeta, c.createdAt, c.updatedAt,c.parent) FROM Category c where c.code = :code")
CategoryDto findCategoryByCode(String code);
我不能使用 c.parent
因为类型是 Category
而不是 CategoryDto
,而且我没有找到任何选项来使用嵌套投影来填充父级给定实体的信息。有人可以帮我解决以下问题吗?
- 有没有办法使用基于 class 的投影来实现此目的?
- 我是否需要回退到单独填写父信息的选项(在初始加载时我不需要很多父信息。)。
- 还有其他方法可以实现吗?我不想使用基于界面的投影作为初始测试,显示它与基于 class 的投影相比非常慢。
在 Spring Data JPA 中没有开箱即用的支持。
实现这一点的方法是使用 constructor expressions and ResultTransformer