[英]How to return a custom object from a Spring Data JPA GROUP BY query
[英]Return custom object from Spring Data Jpa query
我在jpa存儲庫類中有一個自定義查詢:
package it.univaq.we.internshipTutor.repository;
import ...
public interface ProfessorRepository extends JpaRepository<Professor, Long> {
List<Professor> findAll();
...
@Query(value = "SELECT professor.id, professor.department_id, " +
"professor.first_name, professor.last_name, " +
"professor.email, COUNT(professor_id) as count " +
"FROM professor LEFT JOIN student_internship ON professor.id = professor_id " +
"GROUP BY professor_id ORDER BY count DESC LIMIT ?1", nativeQuery = true)
List<ProfessorInternshipCount> mostRequestedProfessors(int limit);
}
該查詢返回10個最需要的實習輔導員/教授; 結果由教授的信息和整數值(計數)組成。
教授模特課:
package it.univaq.we.internshipTutor.model;
import ...
@Entity
@Table(name = "professor")
public class Professor {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;
@Transient
private UUID uuid;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "department_id", nullable = false)
@NotNull(message = "this field is mandatory")
private Department department;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "professor")
private List<StudentInternship> studentInternships;
@Column(name = "first_name", nullable = false, length = 255)
@NotEmpty
private String firstName;
@Column(name = "last_name", nullable = false, length = 255)
@NotEmpty
private String lastName;
@Column(name = "email", nullable = false, length = 255)
@Email
@NotEmpty
private String email;
...getters and setters...
}
ProfessorInternshipCount模型(創建以封裝查詢結果):
package it.univaq.we.internshipTutor.model;
public class ProfessorInternshipCount {
private Professor professor;
private Integer count;
public ProfessorInternshipCount(Professor professor, int count) {
this.professor = professor;
this.count = count;
}
...getters and setters...
}
現在,我很難將查詢返回的內容與我創建的模型綁定。 更准確地說,我得到以下例外:
org.springframework.core.convert.ConverterNotFoundException:
No converter found capable of converting from type
[org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap]
to type
[it.univaq.we.internshipTutor.model.ProfessorInternshipCount]
...
難道我做錯了什么? 有沒有更好的方法來做我想做的事情?
您可以使用投影輕松實現此目的。 在這里你有以下列:
private String firstName;
private String lastName;
private Long id;
使用查詢中的getter創建一個接口。 您的預測將是這樣的:
public interface ITestProjection {
Long getId();
Integer getCount();
String getFirstName();
String getLastName();
}
您的查詢將是這樣的:
@Query(value = "SELECT professor.id, professor.department_id, " +
"professor.first_name, professor.last_name, " +
"professor.email, COUNT(professor_id) as count " +
"FROM professor LEFT JOIN student_internship ON professor.id = professor_id " +
"GROUP BY professor_id ORDER BY count DESC LIMIT =?1", nativeQuery = true)
ArrayList<ITestProjection> findDataWithCount(Integer limit);
希望這能解決你的問題。
有關詳細信息,請訪問此主題 。
謝謝 :)
您可以通過以下方式執行此操作。
閱讀文章以獲取更多詳細信息。
例如,讓我們擁有:
用戶 - 具有許多字段的實體對象。
UserBean - 只是我們的數據將被轉換的對象。
不好的做法:
@Repository
public class ReportingRepository {
@PersistenceContext
private EntityManager em;
public List<UserBean> findQuery() {
Query query = em.createNativeQuery("select ... from Table INNER JOIN ...");
List<UserBean> items = (List<UserBean>) query.getResultList();
return items;
}
}
但它會返回數組中的值,所以如果我們編寫以下代碼會更漂亮,這是更好的做法:
query.unwrap(SQLQuery.class)
.addScalar("instance name", StringType.INSTANCE)
.addScalar("second instance name", IntegerType.INSTANCE)
.setResultTransformer(Transformers.aliasToBean(UserBean.class));
List<UserBean> items = query.getResultList();
所以最后一切都轉換為UserBean類。 請注意 ,在addScalar方法中,您應該傳遞實例變量名稱(在您的問題中,您有計數變量)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.