簡體   English   中英

Java - 返回由兩個不同表組成的對象的 Spring 引導查詢

[英]Java - Spring boot query that return an object made from two different tables

我有兩個通過 id 引用的實體。

一個實體是候選人:

@Entity
@Table(name = "eupass_candidate", schema = "hrast")
public class Candidate{

    private long id;
    private String firstName;
    private String lastName;
    private String address;
    private String munic;
    private String postalCode;
    // getters and setters

}

另一個是

@Entity
@Table(name = "eupass_pdffile", schema = "hrast")
public class PDFFile implements Serializable {

private static final long serialVersionUID = -753514667628201960L;
private long id;
private byte[] pdfFile;
private Long idCandidate;

現在我需要連接這兩個表並檢索候選人的名字、姓氏和 pdf(如果有的話)。

我通過以下查詢對此進行了管理:

SELECT fname, lname, pdf_file 
FROM hrast.eupass_candidate  
LEFT OUTER join hrast.eupass_pdffile 
     ON (hrast.eupass_candidate.id = hrast.eupass_pdffile.id_candidate)

最后我想將結果保存在一個對象中並將其發送到前端應用程序。

我知道我可以在擴展的 CrudeReopository 中編寫查詢注釋,但在 witch one 中。

  • 我需要另一個對象嗎
  • 或者 java 是否允許您為此目的創建一個就地對象

這種方法怎么樣?

@Entity
@Table(name = "eupass_pdffile", schema = "hrast")
public class PDFFile implements Serializable {

    private static final long serialVersionUID = -753514667628201960L;
    private long id;
    private byte[] pdfFile;
    private Long idCandidate;
    //@ManyToMany
    @JoinColumn(name="id_candidate") //or whatever your column name is.
    private Candidate candidate ;
}

我需要另一個對象嗎?

是的,如@ngueno 在評論中所寫,您需要保存加入結果的 POJO 對象(firstName、lastName、pdfFile)

如果您的要求不是使用 JPA 關系,如果您必須自己管理它,那么您可以在 CandidateRepository 或 PDFFileRespositry 中的任何存儲庫類中編寫查詢。

例如:

import com.example.customquerywithjpa.dto.CandidatePDFFile;
import com.example.customquerywithjpa.entity.Candidate;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface CandidateRepository extends JpaRepository<Candidate, Long> {

    // Inner Join
    @Query("SELECT new com.example.customquerywithjpa.dto.CandidatePDFFile(c.firstName, c.lastName, p.pdfFile) from Candidate c INNER JOIN PDFFile p ON (c.id=p.idCandidate) WHERE c.id =:candidateId")
    List<CandidatePDFFile> fetchCandidateAndPDFFIleByCandidateId(@Param("candidateId") long candidateId);

    // Left outer join
    @Query("SELECT new com.example.customquerywithjpa.dto.CandidatePDFFile(c.firstName, c.lastName, p.pdfFile) from Candidate c LEFT OUTER JOIN PDFFile p ON (c.id=p.idCandidate) WHERE c.id =:candidateId")
    List<CandidatePDFFile> fetchCandidateFirstNameLastNameAndItsPDFFileIfExists(@Param("candidateId") long candidateId);
}

為了更好地理解,我創建了示例項目並在假設一名候選人可以擁有零個或多個 pdf 文件的情況下考慮您的用例進行測試。 請參考下面的github存儲庫:

spring-data-jpa-query-that-return-an-custom-objectmade-from-two-different-tables

提取列表<object> Java / Spring Boot 查詢結果<div id="text_translate"><p>我想在查詢中獲取結果的值。</p><p> 這是我的查詢/存儲庫文件:</p><pre> @Query("select p.name, p.contact_no, p.email_address, p.time_submitted, p.date_due from Application p where p.application_number like?1") List<Application> getApplicationSummaryInfo(String application_number);</pre><p> 服務:</p><pre> public List<Application> getApplicationSummaryInfo(String application_number);</pre><p> 服務實現:</p><pre> @Override public List<Application> getApplicationSummaryInfo(String application_number) { return (List<Application>)applicationRepository.getApplicationSummaryInfo(application_number); }</pre><p> Controller:</p><pre> List<Application> app_info = applicationService.getApplicationSummaryInfo(application_no);</pre><p> 我只知道如何使用 foreach 在 jsp 文件中訪問它。 但我想訪問我的 controller 文件中的字段。</p><p> 我試過這樣做:</p><pre> List<Application> app_info = applicationService.getApplicationSummaryInfo(application_no); System.out.println(app_info.get(0));</pre><p> 我得到這個結果:</p><pre> [Ljava.lang.Object;@28bf8e6e</pre><p> 然后我嘗試獲取確切的“名稱”字段值</p><pre>List<Application> app_info = applicationService.getApplicationSummaryInfo(application_no); System.out.println(app_info.get(0).getName());</pre><p> 但我得到這個錯誤</p><pre>java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class com.pckg_name.model.Application ([Ljava.lang.Object; is in module java.base of loader 'bootstrap'; com.rtc_insurance.model.Application is in unnamed module of loader 'app')</pre><p> 真的希望你能幫助我。 謝謝!</p></div></object>

[英]Extract List<Object> result from query in Java / Spring Boot

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 在Spring boot中使用mysql join作為一個java對象返回兩個表的數據 返回列表<object>從 Spring Boot 中的@Query 來看 提取列表<object> Java / Spring Boot 查詢結果<div id="text_translate"><p>我想在查詢中獲取結果的值。</p><p> 這是我的查詢/存儲庫文件:</p><pre> @Query("select p.name, p.contact_no, p.email_address, p.time_submitted, p.date_due from Application p where p.application_number like?1") List<Application> getApplicationSummaryInfo(String application_number);</pre><p> 服務:</p><pre> public List<Application> getApplicationSummaryInfo(String application_number);</pre><p> 服務實現:</p><pre> @Override public List<Application> getApplicationSummaryInfo(String application_number) { return (List<Application>)applicationRepository.getApplicationSummaryInfo(application_number); }</pre><p> Controller:</p><pre> List<Application> app_info = applicationService.getApplicationSummaryInfo(application_no);</pre><p> 我只知道如何使用 foreach 在 jsp 文件中訪問它。 但我想訪問我的 controller 文件中的字段。</p><p> 我試過這樣做:</p><pre> List<Application> app_info = applicationService.getApplicationSummaryInfo(application_no); System.out.println(app_info.get(0));</pre><p> 我得到這個結果:</p><pre> [Ljava.lang.Object;@28bf8e6e</pre><p> 然后我嘗試獲取確切的“名稱”字段值</p><pre>List<Application> app_info = applicationService.getApplicationSummaryInfo(application_no); System.out.println(app_info.get(0).getName());</pre><p> 但我得到這個錯誤</p><pre>java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class com.pckg_name.model.Application ([Ljava.lang.Object; is in module java.base of loader 'bootstrap'; com.rtc_insurance.model.Application is in unnamed module of loader 'app')</pre><p> 真的希望你能幫助我。 謝謝!</p></div></object> 用 Java Spring Boot 中兩種不同類型的兩個 findAll() 填充 DTO spring boot jpa:從與表架構無關的jpa查詢返回自定義對象 @Query Java Spring Boot 如何使用spring rest api從休眠的兩個表中獲取數據並在單個對象中返回URL 如何將 Java 日期時區從服務器本地時區更改為 Spring Boot 本機查詢的不同時區? 從 Spring 引導中的多個表對 select 的通用查詢 兩個不同的查詢返回相同的對象 Spring Boot JPA
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM