선언적으로 SQL 데이터베이스 쿼리 [동영상]

16450 단어 jakartaeevaadinsqljava
Apache Delta Spike는 JPA 사용을 용이하게 하는 모듈이 포함된 CDI 확장 세트입니다. 여기에는 리포지토리와 쿼리를 선언적으로 정의할 수 있는 가능성이 포함됩니다. 이 기사에서는 쿼리 자체를 구현하지 않고 리포지토리 인터페이스에 쿼리 메서드를 추가하는 방법을 설명합니다.

원하는 경우 비디오 버전을 볼 수 있습니다.



클래스 경로에 Apache DeltaSpike의 데이터 모듈이 있는 Jakarta EE 애플리케이션에서 작업 중이라고 가정해 보겠습니다(프로젝트 구성 방법을 알아보려면 this article 확인). 아마도 Entity 클래스가 있을 것입니다. 예를 들어:

package com.example.app;

import javax.persistence.*;
import java.time.LocalDate;
import java.util.Objects;

@Entity
@Table(name = "users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;

    @Column(name = "email")
    private String email;

    @Column(name = "birth_date")
    private LocalDate birthDate;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(id, user.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public LocalDate getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(LocalDate birthDate) {
        this.birthDate = birthDate;
    }
}


이 Entity 클래스는 MySQL, Oracle, PostgreSQL 또는 JDBC를 지원하는 다른 데이터베이스의 SQL 테이블에 매핑됩니다. JPA를 사용하여 데이터베이스를 쿼리할 수 있습니다. 예를 들어 JPQL을 사용하여 쿼리를 구현하고 API를 사용하여 쿼리를 실행하고 결과를 User 개체 형식으로 가져와야 합니다. Apache DeltaSpike의 데이터 모듈을 사용하면 Apache DeltaSpike가 런타임에 구현하는 Java 인터페이스를 작성할 수 있습니다. 다음은 필요한 새UserRepository 인터페이스의 첫 번째 반복입니다.

package com.example.app;

import org.apache.deltaspike.data.api.EntityRepository;
import org.apache.deltaspike.data.api.Repository;

@Repository
public interface UserRepository extends EntityRepository<User, Integer> {

}


이 인터페이스는 확장EntityRepository하여 데이터 조작에 유용하고 자주 사용되는 몇 가지 방법을 포함합니다.



그러나 이러한 종류의 리포지토리 인터페이스를 사용하는 이점은 여기서 끝나지 않습니다. 사용자 지정 쿼리를 구현하지 않고도 인터페이스에 추가할 수 있습니다. 이것은 이름 규칙을 사용하여 작동합니다. 예를 들어 UserRepository 인터페이스에 새 메서드를 추가해 보겠습니다.

package com.example.app;

import org.apache.deltaspike.data.api.EntityRepository;
import org.apache.deltaspike.data.api.Repository;

import java.util.List;

@Repository
public interface UserRepository extends EntityRepository<User, Integer> {

    List<User> findByEmail(String email);

}


Apache DeltaSpike는 이 인터페이스를 검사하고 메서드를 찾습니다. 메서드 이름의 findBy 부분은 규칙이며, 그 의미는 무엇입니까! 이메일이 매개변수로 전달된 모든 사용자를 찾습니다. 물론, 이메일의 경우 아마도 하나일 것입니다. 하지만 이메일이 @test.com 로 끝나는 모든 사용자를 찾는 방법이 필요할 수도 있습니다. 이를 달성하기 위해 메소드의 이름을 변경할 수 있습니다.

package com.example.app;

import org.apache.deltaspike.data.api.EntityRepository;
import org.apache.deltaspike.data.api.Repository;

import java.util.List;

@Repository
public interface UserRepository extends EntityRepository<User, Integer> {

    List<User> findByEmailLike(String email);

}


이제 메소드의 이름을 읽을 때 매개변수로 전달된 표현식과 같은 이메일이 있는 사용자를 찾고자 한다는 것이 분명해야 합니다. "like"라는 단어는 같은 이름을 가진 SQL 연산자를 나타냅니다. 다음과 같이 저장소를 사용할 수 있습니다.

List<User> users = userRepository.findByEmailLike("%@test.com");

% 문자는 0, 1 또는 여러 문자를 나타냅니다. UserRepository 유형의 참조를 백엔드 서비스 클래스 또는 UI 클래스에 주입할 수 있습니다(아마도 중간에 서비스 클래스를 추가해야 하지만 연습으로 남겨두겠습니다). 예를 들어 Vaadin을 사용하여 Java에서 웹 그래픽 사용자 인터페이스를 생성하고 거기에 저장소를 삽입한 다음 사용자가 이메일로 필터링할 수 있도록 웹 브라우저의 그리드에 결과를 표시할 수 있습니다.

package com.example.app;

import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.notification.Notification;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.router.Route;

import javax.inject.Inject;
import java.util.List;

@Route("")
public class MainView extends VerticalLayout {

    @Inject
    public MainView(UserRepository userRepository) {
        Long count = userRepository.count();
        Notification.show("Users: " + count);

        Grid<User> grid = new Grid<>(User.class);
        grid.setColumns("email", "birthDate");
        grid.setItems(userRepository.findAll());

        TextField filter = new TextField();
        filter.setPlaceholder("Filter by email...");
        filter.addValueChangeListener(event -> {
            List<User> users = userRepository.findByEmailLike("%" + filter.getValue() + "%");
            grid.setItems(users);
        });


        add(filter, grid);
    }

}


Apache DeltaSpike에는 더 많은 이름 규칙이 있습니다. 예를 들어 특정 날짜에 태어난 사용자 수와 함께 countByBirthDate(LocalDate birthDate)를 반환하거나 이메일이 제공된 사용자를 삭제하는 long 메서드removeByEmail(String email)가 있을 수 있습니다. 접미사(예제에서 likeEmail)에서도 마찬가지입니다. EmailNotLike , EmailIgnoreCase 등을 사용할 수 있습니다. 메서드 표현식을 사용하는 방법에 대한 자세한 예제와 세부 정보는 공식documentation을 확인하세요.

좋은 웹페이지 즐겨찾기