Spring JPA 참고

이재철·2021년 7월 17일
0

Spring Data

목록 보기
2/2

Query subject keywords

  • find…By
  • read…By
  • get…By
  • query…By
  • search…By
  • stream…By
  • exists…By
  • count…By
  • delete…By
  • remove…By
  • …First<number>…, …Top<number>…
  User findFirstByOrderByAgeAsc();
  List<User> findFirst2ByOrderByAgeAsc();

  User findTopByOrderByAgeAsc();
  List<User> findTop2ByOrderByAgeAsc();
  • …Distinct…
  List<User> findDistinctByName(String name);

메소드 이름 안에서 지원되는 키워드들

keywordMethodNameQuery
AndfindByLastnameAndFirstname… where x.lastname = ?1 and x.firstname = ?2
OrfindByLastnameOrFirstname… where x.lastname = ?1 or x.firstname = ?2
Is,EqualsfindByFirstname
findByFirstnameIs
findByFirstnameEquals
… where x.firstname = 1?
BetweenfindByStartDateBetween… where x.startDate between 1? and ?2
LessThanfindByAgeLessThan… where x.age < ?1
LessThanEqualfindByAgeLessThanEqual… where x.age <= ?1
GreaterThanfindByAgeGreaterThan… where x.age > ?1
GreaterThanEqualfindByAgeGreaterThanEqual… where x.age >= ?1
AfterfindByStartDateAfter… where x.startDate > ?1
BeforefindByStartDateBefore… where x.startDate < ?1
IsNullfindByAgeIsNull… where x.age is null
IsNotNull,NotNullfindByAge(Is)NotNull… where x.age not null
LikefindByFirstnameLike… where x.firstname like ?1
NotLikefindByFirstnameNotLike… where x.firstname not like ?1
StartingWithfindByFirstnameStartingWith… where x.firstname like ?1 (앞 글자에 ?이 포함되는지)
EndingWithfindByFirstnameEndingWith… where x.firstname like ?1 (뒷 글자에 ?이 포함되는지)
ContainingfindByFirstnameContaining… where x.firstname like ?1 (parameter bound wrapped in %)
OrderByfindByAgeOrderByLastnameDesc… where x.age = ?1 order by x.lastname desc
NotfindByLastnameNot… where x.lastname <> ?1
InfindByAgeIn(Collection ages)… where x.age in ?1
NotInfindByAgeNotIn(Collection age)… where x.age not in ?1
TruefindByActiveTrue()… where x.active = true
FalsefindByActiveFalse()… where x.active = false
IgnoreCasefindByFirstnameIgnoreCase… where UPPER(x.firstame) = UPPER(?1)

연관관계

  1. 1:N
    N 부분에 FK에 다음과 같이 작성
  @ManyToOne
  @JoinColumn(name = "userId")
  1. 양방향 매핑
  @OneToMany(mappedBy = "user")

하지만 무한 매핑이 일어나는 경우

  @JsonIgnoreProperties({"user"})
  1. optional
    해당 객체에 null이 들어갈 수 있을지를 결정
    @Column 어노테이션에서도 nullable=true로 세팅해도 null이 들어갈 수 있음
    defalut** : true

  2. fetch
    엔티티의 로딩방식을 결정
    EAGER이면 연관된 엔티티를 바로 로딩함.
    LAZY이면 연관된 엔티티를 바로 로딩하지 않고 실제로 해당 객체를 조회할 때 해당 엔티티를 로딩함
    Defalut
    - @ManyToOne=FetchType.EAGER
    - @OneToMany=FetchType.LAZY

  3. cascade:
    영속성 전이 설정을 할 수 있음.
    PERSIST 부모 엔티티를 저장할 때 자식 엔터티도 같이 저장함
    REMOVE 부모 엔티티를 삭제하면 자식 엔터티도 같이 삭제됨
    DETACH 부모 엔티티가 detach 상태로 되면 자식 엔터티도 같이 detach 되어 변경사항이 반영되지 않음.
    REFRESH 부모 엔터티가 DB로부터 데이터를 다시 로드하면 자식 엔터티도 DB로부터 데이터를 다시 로딩함.
    MERGE 부모 엔티티가 detach 상태에서 자식 엔터티를 추가/변경한 이후에 부모 엔티티가 merge를 수행하면 자식 엔터티도 변경사항이 적용됨.
    ALL 모든 cascade 옵션 적용

어노테이션

  • 기본키
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
자동 생성(@GeneratedValue)

IDENTITY : 데이터베이스에 위임(MYSQL)
	Auto_Increment
SEQUENCE : 데이터베이스 시퀀스 오브젝트 사용(ORACLE)
	@SequenceGenerator 필요
TABLE : 키 생성용 테이블 사용, 모든 DB에서 사용
	@TableGenerator 필요
AUTO : 방언에 따라 자동 지정, 기본값
  • @Entity: 해당 어노테이션을 붙이게 되면 해당 클레스가 데이터베이스의 테이블과 1대1 매칭이 됨.
  • @Column() 해당 맴버변수와 테이블의 Column와 맵핑됨
    1. name : 맵핑할 테이블의 컬럼 이름을 지정합니다만약 없다면 맴버변수의 이름그대로 Colum에 적용됨
    2. insertable : 엔티티 저장시 선언된 필드도 같이 저장 (default=true)
    3. updateable : 엔티티 수정시 이 필드를 함께 수정 (default=true)
    4. table : 지정한 필드를 다른 테이블에 맵핑할 수 있도록 함
    5. nullable : NULL을 허용할지, 허용하지 않을지 결정 (default=false)
    6. unique : 제약조건을 걸 때 사용 (default=false)
    7. columnDefinition : DB 컬럼 정보를 직접적으로 지정할 때 사용
    8. length : varchar의 길이를 조정합니다. 기본값으로 255가 입력됨
    9. precsion, scale : BigInteger, BigDecimal 타입에서 사용합니다. 각각 소수점 포함 자리수, 소수의 자리수를 의미
  • @Embeded, @Embedable: 속성들에 관하여 추상화시키고 싶고 그러한사항에 대하여 새로운테이블로 정의하고 싶지 않을때 사용
@Embeddable
@NoArgsConstructor
@Getter
@Setter
public class Address {
  private String zipCode;
  private String addr;
  private String detail;

  @Builder
  private Address(String zipCode, String addr, String detail){
    this.zipCode = zipCode;
    this.addr = addr;
    this.detail = detail;
  }

}
  
----
  
  @Embedded	
  @AttributeOverrides({
    @AttributeOverride(name = "zipCode", column = @Column(name="zip_code")),
    @AttributeOverride(name = "addr", column = @Column(name="addr")),
    @AttributeOverride(name = "detail", column = @Column(name="detail"))
  })
  private Address address;

0개의 댓글