Come unire i risultati di più tabelle nel repository JPA di Spring

Blog

Come unire i risultati di più tabelle nel repository JPA di Spring

Sono nuovo di Spring e non riesco a capire come unire più tabelle per restituire qualche risultato. Ho provato a implementare una piccola applicazione di libreria come mostrato di seguito.



come acquistare bytecoin

Le mie classi di entità - Prenota, Cliente, Prenotazioni

Book.java - libri disponibili in biblioteca



@Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = 'id', columnDefinition = 'int') private int id; @NotNull(message = 'Book name cannot be null') @Column(name = 'book_name', columnDefinition = 'VARCHAR(255)') private String bookName; @Column(name = 'author', columnDefinition = 'VARCHAR(255)') private String author; // getters and setters public Book() {} public Book(String bookName, String author) { this.bookName = bookName; this.author = author; }

}

Customer.java - Clienti registrati nella libreria



@NotNull(message = 'Customer name cannot be null') @Column(name = 'name', columnDefinition = 'VARCHAR(255)') private String name; @Column(name = 'phone', columnDefinition = 'VARCHAR(15)') private String phone; @Column(name = 'registered', columnDefinition = 'DATETIME') private String registered; // getters and setters public Customer() {} public Customer(String name, String phone, String registered) { this.name = name; this.phone = phone; this.registered = registered; }

}

Booking.java - Tutte le prenotazioni effettuate dai clienti

@NotNull(message = 'Book id cannot be null') @Column(name = 'book_id', columnDefinition = 'int') private int bookId; @NotNull(message = 'Customer id cannot be null') @Column(name = 'customer_id', columnDefinition = 'int') private int customerId; @Column(name = 'issue_date', columnDefinition = 'DATETIME') private String issueDate; @Column(name = 'return_date', columnDefinition = 'DATETIME') private String returnDate; // getters and setters public Booking() {} public Booking(int bookId, int customerId, String issueDate) { this.bookId = bookId; this.customerId = customerId; this.issueDate = issueDate; }

}

Ora gli schemi della tabella per le rispettive entità sono i seguenti:

codice html per la barra dei menu con menu a discesa sottomenu
// some booking apis which return Booking objects @GetMapping public List getAllBookingsBy(@RequestParam('phone') String phone, @RequestParam('authors') List authors) { return bookingService.getAllBy(phone, authors); }

Ora quello che voglio fare è fornire alcuni criteri di prenotazione come il telefono del cliente o il nome dell'autore ecc., Voglio restituire tutte le prenotazioni relative a quell'ordine. Mostrerò un esempio di Booking API per spiegare.

Titolare della prenotazione:

// some booking service methods // get all bookings booked by a customer with matching phone number and books written by a given list of authors public List getAllBy(String phone, List authors) { return bookingRepository.queryBy(phone, authors);

}

Classe di servizio di prenotazione:

@Query(value = 'SELECT * FROM bookings bs WHERE ' + 'EXISTS (SELECT 1 FROM customer c WHERE bs.customer_id = c.id AND c.phone = :phone) ' + 'AND EXISTS (SELECT 1 FROM books b WHERE b.id = bs.book_id AND b.author IN :authors)', nativeQuery = true) List queryBy(@Param('phone') String phone, @Param('authors') List authors);

}
}

Classe di archivio delle prenotazioni:

@Entity @Table(name = 'books') public class Book { 
|_+_|

}

Ora, premendo il controller di prenotazione mostrato, verrà restituito un oggetto di prenotazione simile a questo:

@Entity  
@Table(name = customer, uniqueConstraints = {@UniqueConstraint(columnNames = {phone})})
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = id, columnDefinition = int)
private int id;
|_+_|

Ma non voglio che sia così, voglio restituire insieme a loro il nome del cliente per quella prenotazione e anche il nome del libro. Quindi voglio che gli oggetti di prenotazione restituiti dal controller assomiglino a questo:

domande intervista devops edureka
@Entity  
@Table(name = bookings)
public class Booking {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = id, columnDefinition = int)
private int id;
|_+_|

Qualcuno può aiutare a fare questo? Sono bloccato perché non riesco a procedere da qui.

#java #primavera