我尝试使用基于类的投影来填充数据,但Spring JPA似乎不支持嵌套投影。下面是我的实体类:
public class Category extends BaseEntity<String> {
@Column(unique = true)
private String code;
private String externalCode;
@ManyToOne(cascade = CascadeType.ALL)
private Category parent;
..
}
字符串
下面是相同的DTO类:
@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
,而且我没有找到任何使用嵌套投影来填充给定实体的父信息的选项。有人能帮助我解决以下问题吗?
1.有没有一种方法可以使用基于类的投影来实现这一点?
1.我是否需要回退到单独填充父信息的选项(在初始加载中,我不需要父信息的大量信息。)
1.还有其他的方法吗?我不想使用基于接口的投影作为初始测试,因为与基于类的投影相比,它非常慢。
2条答案
按热度按时间dxxyhpgq1#
Spring Data JPA中没有对此的开箱即用支持。实现此功能的方法是使用constructor expressions和
ResultTransformer
x8goxv8g2#
事实上,可以使用spring data jpa和hibernate创建动态选择查询。它只支持@OneToOne和@ManyToOne查询。看看每个RDBMS支持@OneToMany查询的数组用法。
您可以查看基准测试以了解更多详细信息。hibernate-jpa-class-based-nested-projections-and-speed
一个简单的@ManyToOne示例:
表用户:
字符串
表格地址:
型
Dto:
型
回购和服务层:
型
产出:
型