선언적으로 SQL 데이터베이스 쿼리 [동영상]
원하는 경우 비디오 버전을 볼 수 있습니다.
클래스 경로에 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을 확인하세요.
Reference
이 문제에 관하여(선언적으로 SQL 데이터베이스 쿼리 [동영상]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/alejandro_du/querying-sql-databases-declaratively-video-56nh텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)