使用 Spring Data 将结果集与实体和计数进行映射的首选方法

2023-12-11

通常存在显示所有类别以及这些类别的使用频率的业务问题。

这个问题很容易通过查询来回答:

SELECT c.*, count(*) FROM category_assignment ca LEFT JOIN category c on ca.c_id = c.id group by c.id

我要求的是您建议的基于以下内容映射结果集的方法:

@Entity
public class CategoryAssignment {
    @Id
    int id;

    @ManyToOne(fetch = FetchType.EAGER)
    private Category category;

    @ManyToOne(fetch = FetchType.EAGER)
    private Car car;
}


@Entity
public class Category {
    @Id
    String id;
    TypeEnum type;
    ...
}

@Entity
public class Car {
    @Id
    int id;
    String name;
    ...
}

从我的角度来看,映射的最佳结果是获取一个自定义对象,其中包含作为实体的类别和作为存储库调用之外的附加变量的计数:

MappingResult result = repository.getCategoriesAndTheirCountOfType(TypeEnum type);

public class MappingResult {
    Category category;
    BigInteger count;
}

到目前为止,我能够实现这一目标的唯一方法是手动映射结果集。但我希望有更简单的方法来绘制它。


您可以使用预测为拿到它,为实现它:

public interface CategoryAndCount {
    Category getCategory();
    Long getUsageCount();
}

public interface CategoryAssignmentRepository extends CrudRepository<CategoryAssignment, Integer> {

    @Query("select c as category, count(*) as usageCount from CategoryAssignment ca join ca.category c where c.type = ?1 group by c") 
    CategoryAndCount getCategoriesAndTheirCountOfType(TypeEnum type);
}

不要忘记向查询中的字段添加别名(c ascategory, 计数(*)为使用次数).

更多信息

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Spring Data 将结果集与实体和计数进行映射的首选方法 的相关文章

随机推荐