본문 바로가기
반응형

JPA27

spring 에서 데이터 초기화 방법(Hibernate / sql 사용) Spring 을 기동할때 필요한 테이블을 초기화 할수가 있다. 이전에는 H2 Database 일 경우에 초기화 방법을 다뤘는데 이번엔 다른 DBMS일 경우에도 사용 가능한 방법을 작성해볼 것이다.H2 에 대해서는 참고 포스팅 참고 바란다. Hibernate 사용시 application.yml 파일에 추가한다.spring:  jpa:    hibernate:      ddl-auto: update    generate-ddl: true  // 해당 옵션을 사용할지 말지 여부(기본은 false) 이렇게 해두면 Entity 클래스들을 기준으로 테이블을 생성해준다.ddl-auto 의 옵션은 아래와 같다.옵션설명update기존에 데이터를 유지하며  추가된 정보만 변경(없으면 생성)create-drop애플리케이션 .. 2024. 6. 17.
JPA query did not return a unique result 에러 Spring 에서 JPA 를 사용중에 아래와 같은 에러가 발생했다. query did not return a unique result: 10 원인과 해결방법은 간단하다. 10건의 결과가 있는데 단건으로 받았을 경우이다. 예를 들어 아래와 같은 코드이다.UserEntity entity = userRepository.findByUserNo("1");UserNo 의 값이 1 인 값이 10건이다. List entity = userRepository.findByUserNo("1");List 로 받아주면 해결된다. JPA에서는 Optional 하고도 같이 보면 좋아서 아래 참고 포스팅 참고 바란다. 참고 포스팅https://thenicesj.tistory.com/306 Optional 이란?지난 포스팅에서 dto .. 2024. 5. 29.
NamedQuery 에 대해 Named Query란?Entity에 @NamedQuery 애노테이션을 부여해서 이 쿼리를 이름으로 불러서 사용할 수 있다.쉽게 말하면 미리 이름을 부여해서 재활용 할 수 있는 JPQL이다.이는 동적 쿼리는 불가능하며 정적 쿼리만 가능하다. 애플리케이션 로딩 시점에 이 쿼리를 JPA가 미리 파싱해서 캐싱을 해놓고, 로딩 시점에 쿼리 검증이 가능하다. 사용법은 Entity 에서 사용을 하고 아래와 같다...이상 생략@Entity@NamedQuery(    name = "User.findByName",    query = "SELECT a FROM USER AS a WHERE a.name = :name")public class User {..이하 생략..이상 생략List users = em.createNam.. 2024. 5. 7.
[JPA] 일부 컬럼만 가져오기 JPA에서 findBy 명령어를 사용하여 entity 를 가져오곤 한다. 자세한 내용은 아래 참고 포스팅 참고 바란다. 만약 entity 에 컬럼이 10개면 10개 컬럼 모두 가져오고 불필요한 컬럼들을 모두 가져오는 경우가 있다. 필요한 컬럼만 가져오는 방법에 대해서 다루려고 한다. 기존 로직은 아래와같다. List findAll(); ///////////////// @Entity public class TestEntity{ @Id public String id; public String name; public String addr; ... } 여기서 id와 name만을 가져오고 싶다면? 필요한 컬럼들만 interface로 다시 만들어준다. public interface TestInterface{ Str.. 2024. 2. 14.
[JPA] save 시 select 쿼리 발생 (Persistable 의 isNew 사용) 이전 포스팅에서 dirty checking 관련해서 글을 다룬적이 있다. 자세한 내용은 아래 참고 포스팅을 참고 바란다. 엔티티를 가지고 작업을 하게 될 경우 매번 select 을 하고 update를 하거나 insert 를 할때 더티 체킹을 한다면 만약 bulk insert를 jpa에서 하게 될 경우엔 어떻게 해야할까? 별도의 작업이 없이 읽어서 insert를 하기만 하면된다. 코드는 아래와 같이 간단하다. TestTable ent = TestTable.builder() .id(id) .nameValue("test") .gender(1) .build(); repo.save(ent); 이대로 실행을 하면 [interceptor] requestURI : /test/entitysetnew Hibernate: .. 2024. 2. 7.
JPA메서드 save 와 saveAll 비교 Entity 를 사용하여 save를 할 경우 정상일 경우라면 insert 가 된다. saveAll 함수를 사용하게 될경우엔 List 를 형으로 받아서 처리를 해주고, 리스트를 bulk insert 처럼 삽입을 할수 있다. 둘의 성능 차이가 궁금해서 비교해보았다. 결국 SaveAll 함수 내부 로직을 보면 @Transactional @Override public List saveAll(Iterable entities) { Assert.notNull(entities, "Entities must not be null"); List result = new ArrayList(); for (S entity : entities) { result.add(save(entity)); } return result; } 이와.. 2024. 1. 19.
[JPA] @OneToMany , @ManyToOne JPA 를 사용시 단일 Entity 조회의 경우엔 그냥 사용하면 되지만 다른 테이블과 참조 키가 걸려있거나 Join을 해야하는경우 Entity에서 join하는 특정 테이블을 선언하고 어떤 컬럼과 연관관계인지 명시를 해줘야한다. 일단 Table Name= Grade 순번(pk) 학번 과목 성적 1 111111 수학 A 2 111112 수학 B Table Name= Student 학번 이름 ... 111111 홍길동 111112 이순신 111113 장영실 이렇게 두 테이블이 있다고 가정을 하고 각각 Entity 를 선언해볼것이다. 가독성을 위해 변수명은 한글로 지정할것이다. Grade Table @Getter @Setter @ToString @Builder @AllArgsConstructor @NoArgsC.. 2023. 9. 18.
JPA query Keyword2 (repository) 이전 포스팅에서 jpa 사용하는 query keyword에서 사용하는 메서드들을 정리한 글이 있다. (아래 참고 포스팅 참조) findById부터 시작해서 다양한 메서드가 있었는데 like 문에 대한 내용을 적은적이 없는것 같아서 적으려고 한다. 먼저 Like는 크게 3가지 방법으로 지정할수있다. 1. findByNameLike(String name); repository 에서는 이렇게 사용이 되며 service단에서 호출할때는 List list = repository.findByNameLike("%"+ dto.getName() +"%"); 이렇게 와일드카드를 붙여줘야한다. 이점이 불편해서 나온것이 2. findByNameContains / findByNameContaining / findByNameIs.. 2023. 5. 6.
spring data jpa의 @Query nativeQuery의 IN 절 처리 Query annotation 에서 항상 단건의 변수만 사용을 하다가 리스트로 받아서 in 절에 처리를 해야할 일이 생겼다. 물론 반복문으로 받아서 list를 합쳐도 되지만 좀더 편한 방법이 없을까 하다가 아래 방법을 알게 되었다. 아래와 같이 정의를 하게 되면 리스트를 받아서 쿼리로 in 절로 넣을수 있다. 참고로 객체는 안되고 String이나 integer 등 변수 타입만 가능하다. List findByXXXXXX(@Param("idList") List idlist); 이렇게 선언을 하고 쿼리에서는 아래처럼 사용을 한다. where and id in :idList 2023. 2. 3.
반응형