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的属性。好处是该属性始终可用,并且您不需要调用任何特定的查询
@OneToOne
@Formula
注释,可用于设置计算值您可以通过以下两种方法之一将其作为Catgeory的属性。好处是该属性始终可用,并且您不需要调用任何特定的查询
@OneToOne
@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;
}