![](/img/trans.png)
[英]Spring Data JPA with QueryDSL, Count issue with aggregate function
[英]JPA Queries Aggregate function COUNT with two tables
我有兩個實體:州長和州與多對一關聯。 我需要獲取所有有/曾經有州長的州並顯示他們的人數。 我正在使用 PostgreSQL。 它看起來像這樣:
SELECT official_state_name, COUNT (governor.id_governor) from state
RIGHT JOIN governor ON state.id_state = governor.id_state
GROUP BY official_state_name
但是,我不知道應該如何在 Spring Data JPA 中完成。 我知道我需要創建像 GovernorsCount 這樣的附加類並聲明這兩個字段。 但這些是來自兩個不同表的字段,也不是一個。 所以這是我在 JPA 中的查詢:
@Transactional
@Query(value="SELECT official_state_name, COUNT (governor.id_governor) from state\n" +
"RIGHT JOIN governor ON state.id_state = governor.id_state\n" +
"GROUP BY official_state_name", nativeQuery = true)
List <State> findAllStatesAndGovernors();
這是兩個 POJO 類:
@Entity
@Table(name = "state")
public class State implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_state")
private Integer idState;
@Column(name = "official_state_name")
private String officialStateName;
@Column(name = "official_language")
private String officialLanguage;
@Column(name = "state_currency")
private String stateCurrency;
//setters and getters
@Entity
@Table(name = "governor")
public class Governor implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_governor")
private Integer idGovernor;
@Column(name = "pib")
private String fullName;
@Column(name = "age")
private Integer age;
@Column(name = "position")
private String position;
@Column(name = "date_of_intercession")
private java.sql.Date dateOfIntercession;
@Column(name = "date_of_resignation")
private java.sql.Date dateOfResignation;
@Column(name = "per_capita_income")
private Double perCapitaIncome;
@Column(name = "population_below_poverty")
private Integer populationBelowPoverty;
@ManyToOne
@JoinColumn(name = "id_state", nullable = false)
private State state;
//setters and getters
那么我該如何做這個操作呢? 任何幫助表示贊賞。
您可以返回List<Object[]>
。
@Transactional
@Query(value="SELECT official_state_name, COUNT (governor.id_governor) from state\n" +
"RIGHT JOIN governor ON state.id_state = governor.id_state\n" +
"GROUP BY official_state_name", nativeQuery = true)
List<Object[]> findAllStatesAndGovernors();
List<Object[]> results = repository.findAllStatesAndGovernors();
for( Object[] row : results) {
String officialStateName = (String)row[0];
int count = (Integer)row[1];
}
您也可以使用 JPQL 查詢來執行此操作:
@Transactional
@Query("SELECT state, COUNT(governor) from Governor governor\n" +
"LEFT JOIN governor.state state\n" +
"GROUP BY state.officialStateName")
List <Object[]> findAllStatesAndGovernors();
List<Object[]> results = repository.findAllStatesAndGovernors();
for( Object[] row : results) {
State state = (State)row[0];
int count = (Integer)row[1];
}
如果您只需要州名,則可以將 select 子句更改為SELECT state.officialStateName, COUNT(governor)
。
首先,必須按以下方式定義實體
@Entity
public class State {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
...
@OneToMany(mappedBy = "state")
private List<Governor> governors;
...
}
@Entity
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
...
@ManyToOne
private State state;
...
}
上面是一個雙向 OneToMany 映射。
為了獲得計數,您可以使用 JPA 使用以下查詢。
for(State state : stateRepository.findAll()) {
List<Governor> governors = state.getGovernors();
System.out.printf("%s %s\n", state.getName(), governors.size());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.