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

Jpa 使用Spring数据将结果集与实体和计数映射的首选方法,jpa,spring-data,hql,Jpa,Spring Data,Hql,通常,业务问题是显示所有类别以及这些类别的使用频率 这个问题很容易用一个问题来回答: 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(

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

这个问题很容易用一个问题来回答:

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;
}
到目前为止,我能够实现它的唯一方法是手动映射结果集。但我希望有更简单的方法来绘制地图

您可以使用来获取它:

公共接口类别和帐户{
类别getCategory();
Long getUsageCount();
}
公共接口类别SignmentRepository扩展了Crudepository{
@查询(“选择c作为类别,count(*)作为usageCount from CategorySignment ca join ca.category c,其中c.type=?1按c分组”)
CategoryAndCount GetCategories及其计数类型(TypeEnum类型);
}
别忘了将别名添加到查询中的字段中(c为类别,count(*)为usageCount

您可以使用来获取:

公共接口类别和帐户{
类别getCategory();
Long getUsageCount();
}
公共接口类别SignmentRepository扩展了Crudepository{
@查询(“选择c作为类别,count(*)作为usageCount from CategorySignment ca join ca.category c,其中c.type=?1按c分组”)
CategoryAndCount GetCategories及其计数类型(TypeEnum类型);
}
别忘了将别名添加到查询中的字段中(c为类别,count(*)为usageCount


您可以通过以下两种方法之一将其作为Catgeory的属性。好处是该属性始终可用,并且您不需要调用任何特定的查询

  • 创建一个数据库视图,比如category\u summary\u data,然后使用辅助表或作为
    @OneToOne
  • --

  • 或者,您可以使用一些提供程序扩展。Hibernate提供了
    @Formula
    注释,可用于设置计算值
  • --


    您可以通过以下两种方法之一将其作为Catgeory的属性。好处是该属性始终可用,并且您不需要调用任何特定的查询

  • 创建一个数据库视图,比如category\u summary\u data,然后使用辅助表或作为
    @OneToOne
  • --

  • 或者,您可以使用一些提供程序扩展。Hibernate提供了
    @Formula
    注释,可用于设置计算值
  • --


    非常感谢。我知道投影,但无法以正确的方式编码。你的回答让我找到了正确的方向。我最大的错误是设置了执行SQL的@Query(nativeQuery=true)。我需要的是Jpql,因此不需要nativeQuery标志。谢谢。我知道投影,但无法以正确的方式编码。你的回答让我找到了正确的方向。我最大的错误是设置了执行SQL的@Query(nativeQuery=true)。我需要的是Jpql,因此答案不需要nativeQuery flag.thx——我从来没有想过这样做。对于我来说,用例预测是更好的方法。但是我会记住你的方法以备将来使用。答案是thx——我从来没有想过这样做。对于我来说,用例预测是更好的方法。但我会记住你的方法,以备将来使用。
    @Entity
    @Table(name = "categories")
    @SecondaryTable(name = "category_summary_data", pkJoinColumns = {...})
    public class Category {
        @Id
        String id;
        TypeEnum type;
    
        @Column(name = "usage_count", table = "category_summary_data", insertable = false, updateable = false)
        // do not use int https://stackoverflow.com/questions/43407889/prefered-way-to-map-a-result-set-with-entity-and-count-using-spring-data/43411008#43411008
        Integer usageCount;
    }
    
    @Entity
    @Table(name = "categories")
    public class Category {
        @Id
        String id;
        TypeEnum type;
    
        @Formula("some sql to count the records")
        int usageCount;
    }