0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Hướng dẫn tìm giá trị lớn nhất trong Spring Data JPA

Đăng vào 3 tuần trước

• 5 phút đọc

Hướng dẫn tìm giá trị lớn nhất trong Spring Data JPA

Khi làm việc với Spring Data JPA, việc truy xuất và xử lý dữ liệu từ cơ sở dữ liệu rất quan trọng. Một trong những yêu cầu thường gặp là tìm giá trị lớn nhất trong một cột cụ thể. Trong bài viết này, chúng ta sẽ khám phá nhiều cách tiếp cận để thực hiện điều này một cách hiệu quả.

Giới thiệu về Spring Data JPA

Spring Data JPA là một phần của Spring Data, nhằm mục đích giảm thiểu mã bạn cần viết để tương tác với cơ sở dữ liệu. Thư viện này hỗ trợ bạn thực hiện các thao tác cơ bản như tạo, đọc, cập nhật và xóa dữ liệu mà không cần viết câu lệnh SQL phức tạp. Việc sử dụng Spring Data JPA giúp bạn tiết kiệm thời gian và công sức trong việc phát triển ứng dụng.

Thiết lập cơ sở dữ liệu bằng Docker

Thiết lập cơ sở dữ liệu có thể gây khó khăn cho nhiều lập trình viên, nhưng với Docker, việc này trở nên đơn giản hơn rất nhiều. Sau khi cài đặt Docker, bạn có thể chạy PostgreSQL bằng cách sử dụng lệnh sau:

Copy
docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=your_password --name postgres postgres

Hãy nhớ thay your_password bằng mật khẩu mà bạn mong muốn. Nếu mọi thứ diễn ra tốt đẹp, máy chủ PostgreSQL sẽ hoạt động trên cổng 5432. Bạn có thể kết nối đến cơ sở dữ liệu này bằng các công cụ như DBeaver.

Thiết lập dữ liệu mẫu

Để tiếp tục, bạn cần thiết lập một bảng để lưu trữ dữ liệu sản phẩm trong PostgreSQL:

Copy
drop table if exists product;
create table product (id serial primary key, name varchar(255) not null, price numeric(10, 2) not null);

Ví dụ mã nguồn

Thêm phụ thuộc vào dự án

Trước tiên, hãy thêm các phụ thuộc vào tệp build.gradle. Nếu bạn đã tạo dự án từ Spring Initializr, tệp sẽ tự động có đầy đủ thông tin phụ thuộc:

Copy
plugins {
    id 'java'
    id 'org.springframework.boot' version '3.3.2'
    id 'io.spring.dependency-management' version '1.1.6'
}

group = 'jcg'
version = '0.0.1-SNAPSHOT'

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'org.postgresql:postgresql'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.named('test') {
    useJUnitPlatform()
}

Cấu hình tệp application.properties

Thêm các thuộc tính sau vào tệp application.properties trong thư mục resources:

Copy
spring.application.name=springjpafindmax
spring.main.banner-mode=off

# Cấu hình cơ sở dữ liệu
spring.datasource.url=jdbc:postgresql://localhost:5432/your_database_name
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.datasource.driver-class-name=org.postgresql.Driver

# Cấu hình JPA/Hibernate
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect

# Ghi nhật ký SQL
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

Thay thế your_database_name, your_usernameyour_password bằng thông tin cụ thể của bạn.

Tạo lớp mô hình Product

Tạo lớp thực thể dưới đây để tương tác với JpaRepository:

java Copy
@Entity
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private Double price;

    // Getters và Setters
}

Tạo lớp kho lưu trữ ProductRepository

Tạo giao diện ProductRepository kế thừa từ JpaRepository để thực hiện các thao tác cơ bản trên bảng Product:

java Copy
@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
    Optional<Product> findTopByOrderByPriceDesc();
    @Query("SELECT p FROM Product p WHERE p.price = (SELECT MAX(p2.price) FROM Product p2)")
    Product findMaxPriceProduct();
    @Query(value = "SELECT * FROM Product p WHERE p.price = (SELECT MAX(p2.price) FROM Product p2)", nativeQuery = true)
    Product findMaxPriceProductNative();
}

Tạo lớp chính SpringjpafindmaxApplication

Đây sẽ là lớp chính để khởi động ứng dụng Spring Boot:

java Copy
@SpringBootApplication
public class SpringjpafindmaxApplication implements CommandLineRunner {

    private final ProductRepository productRepository;
    private final ProductRepositoryCustom productRepositoryCustom;

    @Autowired
    public SpringjpafindmaxApplication(ProductRepository pr, ProductRepositoryCustom prc) {
        this.productRepository = pr;
        this.productRepositoryCustom = prc;
    }

    public static void main(String[] args) {
        SpringApplication.run(SpringjpafindmaxApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        // Tạo một số sản phẩm
        List<Product> products = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            Product product = new Product();
            product.setName("Product " + i);
            product.setPrice((double) (i * 100));
            products.add(product);
        }
        productRepository.saveAll(products);

        // Thực hiện các phương pháp tìm kiếm giá cao nhất
        productRepository.findTopByOrderByPriceDesc()
                .ifPresent(p -> System.out.println("Giá cao nhất (truy vấn phái sinh): " + p.getPrice()));

        Product maxPriceProductJPQL = productRepository.findMaxPriceProduct();
        System.out.println("Giá cao nhất (JPQL): " + maxPriceProductJPQL.getPrice());

        Product maxPriceProductNative = productRepository.findMaxPriceProductNative();
        System.out.println("Giá cao nhất (Query gốc): " + maxPriceProductNative.getPrice());

        Product maxPriceProductCustom = productRepositoryCustom.findMaxPriceProduct();
        System.out.println("Giá cao nhất (Kho lưu trữ tùy chỉnh): " + maxPriceProductCustom.getPrice());

        Product maxPriceProductCriteria = productRepositoryCustom.findMaxPriceProductWithCriteriaAPI();
        System.out.println("Giá cao nhất (Criteria API): " + maxPriceProductCriteria.getPrice());
    }
}

Chạy ứng dụng

Sau khi hoàn tất các bước trên, bạn chỉ cần chạy ứng dụng Spring Boot. Khi ứng dụng khởi động thành công, bạn sẽ thấy các thông điệp hiển thị giá sản phẩm cao nhất từ nhiều phương pháp khác nhau trên bảng điều khiển.

Kết luận

Bài viết này đã trình bày cách để tìm giá trị lớn nhất trong Spring Data JPA thông qua các phương pháp khác nhau như truy vấn phái sinh, JPQL, truy vấn gốc, và API Criteria. Mỗi phương pháp đều có những ưu điểm riêng, bạn có thể lựa chọn phù hợp với yêu cầu cụ thể của ứng dụng mình. Hy vọng rằng bạn sẽ áp dụng thành công các cách tiếp cận này trong dự án của mình.
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào