BAEL-6157 - Using records with JPA (#13626)
* BAEL-6157 - Using records with JPA * BAEL-6157 - Changing test class name * BAEL-6157 - Changing test class name * BAEL-6157 - Adding start-class to module
This commit is contained in:
parent
1afb78dde1
commit
22bd0db1bf
@ -124,6 +124,8 @@
|
|||||||
<mapstruct.version>1.5.2.Final</mapstruct.version>
|
<mapstruct.version>1.5.2.Final</mapstruct.version>
|
||||||
<springdoc.version>2.0.0</springdoc.version>
|
<springdoc.version>2.0.0</springdoc.version>
|
||||||
<maven-surefire-plugin.version>3.0.0-M7</maven-surefire-plugin.version>
|
<maven-surefire-plugin.version>3.0.0-M7</maven-surefire-plugin.version>
|
||||||
|
<start-class>com.baeldung.sample.TodoApplication</start-class>
|
||||||
|
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
@ -0,0 +1,42 @@
|
|||||||
|
package com.baeldung.recordswithjpa;
|
||||||
|
|
||||||
|
import com.baeldung.recordswithjpa.entity.Book;
|
||||||
|
import com.baeldung.recordswithjpa.records.BookRecord;
|
||||||
|
import jakarta.persistence.EntityManager;
|
||||||
|
import jakarta.persistence.PersistenceContext;
|
||||||
|
import jakarta.persistence.Query;
|
||||||
|
import jakarta.persistence.TypedQuery;
|
||||||
|
import jakarta.persistence.criteria.CriteriaBuilder;
|
||||||
|
import jakarta.persistence.criteria.CriteriaQuery;
|
||||||
|
import jakarta.persistence.criteria.Root;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class QueryService {
|
||||||
|
@PersistenceContext
|
||||||
|
private EntityManager entityManager;
|
||||||
|
|
||||||
|
public List<BookRecord> findAllBooks() {
|
||||||
|
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
|
||||||
|
CriteriaQuery<BookRecord> query = cb.createQuery(BookRecord.class);
|
||||||
|
Root<Book> root = query.from(Book.class);
|
||||||
|
query.select(cb
|
||||||
|
.construct(BookRecord.class, root.get("id"), root.get("title"), root.get("author"), root.get("isbn")));
|
||||||
|
return entityManager.createQuery(query).getResultList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public BookRecord findBookById(Long id) {
|
||||||
|
TypedQuery<BookRecord> query = entityManager
|
||||||
|
.createQuery("SELECT new com.baeldung.recordswithjpa.records.BookRecord(b.id, b.title, b.author, b.isbn) " +
|
||||||
|
"FROM Book b WHERE b.id = :id", BookRecord.class);
|
||||||
|
query.setParameter("id", id);
|
||||||
|
return query.getSingleResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<BookRecord> findAllBooksUsingMapping() {
|
||||||
|
Query query = entityManager.createNativeQuery("SELECT * FROM book", "BookRecordMapping");
|
||||||
|
return query.getResultList();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
package com.baeldung.recordswithjpa;
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
public class RecordsAsJpaApplication {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(RecordsAsJpaApplication.class, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,70 @@
|
|||||||
|
package com.baeldung.recordswithjpa.entity;
|
||||||
|
|
||||||
|
import com.baeldung.recordswithjpa.records.BookRecord;
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
|
||||||
|
@SqlResultSetMapping(
|
||||||
|
name = "BookRecordMapping",
|
||||||
|
classes = @ConstructorResult(
|
||||||
|
targetClass = BookRecord.class,
|
||||||
|
columns = {
|
||||||
|
@ColumnResult(name = "id", type = Long.class),
|
||||||
|
@ColumnResult(name = "title", type = String.class),
|
||||||
|
@ColumnResult(name = "author", type = String.class),
|
||||||
|
@ColumnResult(name = "isbn", type = String.class)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
@Entity
|
||||||
|
@Table(name = "book")
|
||||||
|
public class Book {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
private String title;
|
||||||
|
private String author;
|
||||||
|
private String isbn;
|
||||||
|
|
||||||
|
public Book() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Book(Long id, String title, String author, String isbn) {
|
||||||
|
this.id = id;
|
||||||
|
this.title = title;
|
||||||
|
this.author = author;
|
||||||
|
this.isbn = isbn;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Long id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitle(String title) {
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAuthor() {
|
||||||
|
return author;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAuthor(String author) {
|
||||||
|
this.author = author;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getIsbn() {
|
||||||
|
return isbn;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIsbn(String isbn) {
|
||||||
|
this.isbn = isbn;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,4 @@
|
|||||||
|
package com.baeldung.recordswithjpa.records;
|
||||||
|
|
||||||
|
public record BookRecord(Long id, String title, String author, String isbn) {
|
||||||
|
}
|
@ -0,0 +1,4 @@
|
|||||||
|
package com.baeldung.recordswithjpa.records;
|
||||||
|
|
||||||
|
public record CustomBookRecord(Long id, String title) {
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package com.baeldung.recordswithjpa.repository;
|
||||||
|
|
||||||
|
import com.baeldung.recordswithjpa.entity.Book;
|
||||||
|
import com.baeldung.recordswithjpa.records.BookRecord;
|
||||||
|
import org.springframework.data.jpa.repository.Query;
|
||||||
|
import org.springframework.data.repository.CrudRepository;
|
||||||
|
import org.springframework.data.repository.query.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface BookRepository extends CrudRepository<Book, Long> {
|
||||||
|
List<BookRecord> findBookByAuthor(String author);
|
||||||
|
|
||||||
|
@Query("SELECT new com.baeldung.recordswithjpa.records.BookRecord(b.id, b.title, b.author, b.isbn) " +
|
||||||
|
"FROM Book b WHERE b.id = :id")
|
||||||
|
BookRecord findBookById(@Param("id") Long id);
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
package com.baeldung.recordswithjpa.repository;
|
||||||
|
|
||||||
|
import com.baeldung.recordswithjpa.records.CustomBookRecord;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface CustomBookRepository {
|
||||||
|
List<CustomBookRecord> findAllBooks();
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package com.baeldung.recordswithjpa.repository;
|
||||||
|
|
||||||
|
import com.baeldung.recordswithjpa.records.CustomBookRecord;
|
||||||
|
import org.springframework.jdbc.core.JdbcTemplate;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
public class CustomBookRepositoryImpl implements CustomBookRepository {
|
||||||
|
private final JdbcTemplate jdbcTemplate;
|
||||||
|
|
||||||
|
public CustomBookRepositoryImpl(JdbcTemplate jdbcTemplate) {
|
||||||
|
this.jdbcTemplate = jdbcTemplate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<CustomBookRecord> findAllBooks() {
|
||||||
|
return jdbcTemplate.query("SELECT id, title FROM book", (rs, rowNum) -> new CustomBookRecord(rs.getLong("id"), rs.getString("title")));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
package com.baeldung.recordswithjpa;
|
||||||
|
|
||||||
|
import com.baeldung.recordswithjpa.entity.Book;
|
||||||
|
import com.baeldung.recordswithjpa.records.BookRecord;
|
||||||
|
import com.baeldung.recordswithjpa.repository.BookRepository;
|
||||||
|
import org.junit.jupiter.api.AfterEach;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
|
public class QueryServiceIntegrationTest extends RecordsAsJpaIntegrationTest {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private QueryService queryService;
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void findAllBooks() {
|
||||||
|
List<BookRecord> allBooks = queryService.findAllBooks();
|
||||||
|
assertEquals(3, allBooks.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void findBookById() {
|
||||||
|
BookRecord bookById = queryService.findBookById(1L);
|
||||||
|
assertEquals("The Lord of the Rings", bookById.title());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void findAllBooksUsingMapping() {
|
||||||
|
List<BookRecord> allBooksUsingMapping = queryService.findAllBooksUsingMapping();
|
||||||
|
assertEquals(3, allBooksUsingMapping.size());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
package com.baeldung.recordswithjpa;
|
||||||
|
|
||||||
|
import com.baeldung.recordswithjpa.entity.Book;
|
||||||
|
import com.baeldung.recordswithjpa.repository.BookRepository;
|
||||||
|
import org.junit.jupiter.api.AfterEach;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
|
||||||
|
@SpringBootTest
|
||||||
|
public class RecordsAsJpaIntegrationTest {
|
||||||
|
@Autowired
|
||||||
|
protected BookRepository bookRepository;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
void setUp() {
|
||||||
|
Book book = new Book(1L,"The Lord of the Rings", "J.R.R. Tolkien", "978-0544003415");
|
||||||
|
Book book2 = new Book(2L,"The Hobbit", "J.R.R. Tolkien", "978-0547928227");
|
||||||
|
Book book3 = new Book(3L,"Harry Potter and the Philosopher's Stone", "J.K. Rowling", "978-0747532699");
|
||||||
|
|
||||||
|
bookRepository.save(book);
|
||||||
|
bookRepository.save(book2);
|
||||||
|
bookRepository.save(book3);
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterEach
|
||||||
|
void tearDown() {
|
||||||
|
bookRepository.deleteAll();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
package com.baeldung.recordswithjpa.repository;
|
||||||
|
|
||||||
|
import com.baeldung.recordswithjpa.RecordsAsJpaIntegrationTest;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
|
class BookRepositoryIntegrationTest extends RecordsAsJpaIntegrationTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void findBookByAuthor() {
|
||||||
|
assertEquals(2, bookRepository.findBookByAuthor("J.R.R. Tolkien").size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void findBookById() {
|
||||||
|
assertEquals("The Lord of the Rings", bookRepository.findBookById(1L).title());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
package com.baeldung.recordswithjpa.repository;
|
||||||
|
|
||||||
|
import com.baeldung.recordswithjpa.RecordsAsJpaIntegrationTest;
|
||||||
|
import com.baeldung.recordswithjpa.records.CustomBookRecord;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
|
class CustomBookRepositoryIntegrationTest extends RecordsAsJpaIntegrationTest {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CustomBookRepository customBookRepository;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void findAllBooks() {
|
||||||
|
List<CustomBookRecord> allBooks = customBookRepository.findAllBooks();
|
||||||
|
assertEquals(3, allBooks.size());
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user