이클립스 IDE에서 queryDsl 관련 설정을 추가 하는 간단한 gradle설정 파일 입니다.

build.gradle
0.00MB

해당 파일의 querydsl 관련 설정 부분을 추가 후 

refresh gradle project -> gradle tasks 탭에서 builde>builde>Run Gradle Tasks 를 해주면

설정한 경로에 Q클래스가 생성 됩니다.

 

반응형
Posted by 질주하는구
,

nativeQuery를 true로 설정 후 결과 값을 Map이 아닌 dto 형식으로 넘기고자 하는 경우 interface를 활용 할 수 있습니다.

 

아래와 같은 쿼리문 실행 후 결과를 담을 

@Query(value = "SELECT MAX(BBS_ITEM_LIST_ORDER) as listOrder, MAX(BBS_ITEM_MINI_ORDER) as miniListOrder, MAX(BBS_ITEM_VIEW_ORDER) as viewOrder  FROM T_BBS_ITEM WHERE BBS_SET_SEQ = :bbsSetSeq" , nativeQuery = true)
public BbsItemInf getMaxOrderSub(@Param("bbsSetSeq") Integer bbsSetSeq);

 

interface를 생성 합니다.

public interface BbsItemInf {
	Integer getListOrder();
	Integer getminiListOrder();
	Integer getviewOrder();
}

생성한 interface는 아래와 같이 받아서 메소드를 호출 해 바로 사용 가능 합니다.

BbsItemInf bbsItemInf = bbsItemRepository.getMaxOrderSub(2);
System.out.println("bbsItemInf: "+bbsItemInf.getListOrder());

데이터 설정은 as 이름으로 설정 됩니다.(아래 stackorverflow내용보면 match by order not by name 이런 내용이 있는데

이건 답변 하신분이 쿼리문 작성시에 as를 하지 않고 컬럼명만 작성해서 순차적으로 데이터 셋팅이 되는 경우로 보입니다.)

https://stackoverflow.com/questions/64762080/how-to-map-sql-native-query-result-into-dto-in-spring-jpa-repository

 

How to map sql native query result into DTO in spring jpa repository?

Hi what I am trying to achieve is to get SQL native query result map into my DTO in java spring jpa repository, how do I do this properly? I try several code, but it does not work, here is what I t...

stackoverflow.com

stackorverflow의 질문 답변에 보면 이런식의 사용의 경우 내부적으로 DTO로 바로 넘기는 방식에 비해서 자원 

낭비가 많다는 이야기가 있어 확실 한 테스트가 필요 합니다.

특별한 경우가 아니라면 가능하면 map을 이용 하는게 좋을거 같습니다.

반응형
Posted by 질주하는구
,

JPA-DATA @ManyToOne 삭제시 부모참조(연결 컬럼 UPDATE) 문제가 생길시

예전 HIBERNATE에서 하던 방식대로 참조 하는 부모객체의 정보를 NULL로 만들어서 연결을 끊어주고 DELETE하는 방식을 사용해야 합니다.

BbsSet<->BbsItem 2개의 테이블이 ManyToOne으로 엮여 있는 경우

@JsonIgnore
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "BBS_SET_SEQ")
private List<BbsItem> bbsItemList = new ArrayList<BbsItem>();

@JsonIgnore
@ManyToOne(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
@JoinColumn(name = "BBS_SET_SEQ", insertable=false, updatable=false)
private BbsSet bbsSet;

BbsItem 삭제시 아래와 같이 UPDATE문을 실행 하게 됩니다.

UPDATE T_BBS_ITEM SET BBS_SET_SEQ=null WHERE BBS_ITEM_SEQ=?

BBS_SET_SEQ 은 FK 키로 잡혀 있기 때문에 NOT NULL이여서 에러가 발생되고 삭제에 실패 하게 됩니다.
이 경우 BbsItem의 bbsSet 을 bbsSet=null; 로 관계를 끊어주고 delete해야 정상적으로 BbsItem 정보가 삭제 됩니다.
(bulk update 할 수도 있는데 다른 방법이 있을거 같은데 hibernate에서 하던 방식으로 처리 했습니다.)

반응형
Posted by 질주하는구
,

JPA-DATA에서 @Query-Map을 이용해서 데이터를 가지고 오는 경우

@Query(value = "SELECT new Map(MAX(bbsItemListOrder) as listOrder, MAX(bbsItemMiniOrder) as miniListOrder, MAX(bbsItemViewOrder) as viewOrder)  FROM BbsItem WHERE bbsSetSeq = :bbsSetSeq")
public Map<String, Integer> getMaxOrder(@Param("bbsSetSeq") Integer bbsSetSeq);

위와 같이 select부분에 new Map 및 as listOrder 로 Map생성 key값 지정 해서 데이터를 조회 할 수 있습니다.

반응형
Posted by 질주하는구
,

T_BBS_ITEM(BbsItem) 테이블의 항목 정보중 특정 컬럼(BBS_ITEM_GROUP-bbsItemGroup-항목그룹) 정보만 가지고 오려는 경우
@Query으로 데이터를 가지고 올 수 있습니다.
이때 return값은 List<String>으로 처리를 하고 쿼리문 작성시 nativeQuery 옵션을 줘서 쿼리문 형식을 원하는 방식으로 정의 할 수 있습니다.

- nativeQuery 옵션 사용
@Query(value = "SELECT BBS_ITEM_GROUP FROM T_BBS_ITEM WHERE BBS_SET_SEQ = :bbsSetSeq", nativeQuery = true)
Hibernate: 
    /* dynamic native SQL query */ SELECT
        BBS_ITEM_GROUP 
    FROM
        T_BBS_ITEM 
    WHERE
        BBS_SET_SEQ = ?

- nativeQuery 옵션 미 사용
@Query(value = "SELECT bbsItemGroup FROM BbsItem WHERE bbsSetSeq = :bbsSetSeq")
Hibernate: 
    /* SELECT
        bbsItemGroup 
    FROM
        BbsItem 
    WHERE
        bbsSetSeq = :bbsSetSeq */ select
            bbsitem0_.BBS_ITEM_GROUP as col_0_0_ 
        from
            T_BBS_ITEM bbsitem0_ 
        where
            bbsitem0_.BBS_SET_SEQ=?

이 경우에는 nativeQuery 옵션을 사용 할 필요 까지 없는 겨우여서 사용 하지 않지만 쿼리문을 직접 사용해야 하는 경우 기존 시스템을 이관해야 하는
경우등 특별한 경우에 해당 옵션을 활용 할 수 있습니다.

반응형
Posted by 질주하는구
,

jpa-data에서 테이블을 oracle의 start with 처럼 재귀적으로 호출 하기 위해 self join 하는 경우 아래와 같이 정의 해주면 됩니다.

T_CONTS_TEMPLATE 테이블의 컬럼 중

CONTS_TEMP_SEQ<--기본키
CONTS_PARENT_SEQ<--부모키
이 존재 하는 경우 parent와 children을 아래와 같이 정의 합니다.

//@Where(clause = "useYn='N'")
@JsonIgnore
@ManyToOne(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
@JoinColumn(name = "CONTS_PARENT_SEQ", insertable=false, updatable=false)
private ContentsTemplate parent;

//@Where(clause = "useYn='N'")
@JsonProperty("nodes")
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "CONTS_PARENT_SEQ")
@OrderBy("contsTempSeq asc")
private List<ContentsTemplate> children = new ArrayList<ContentsTemplate>();


@JsonIgnore 은 부모 객체를 json으로 변경 하면서 children을 재 참조 하는 상황을 방지 하기 위해서 json 생성시 예외 처리 합니다.
@JsonProperty("nodes") 은 Bootstrap Tree View 에서 데이터를 받을때 nodes라는 이름으로 받기 때문에 추가 해줬습니다.
FetchType.LAZY은 가능하면 lazy로 해주는게 좋습니다. EAGER(즉시호출) 하는 경우 예상하지 못한 쿼리문이
출력 되는경우가 생겨서 언제나 쿼리문 검증을 해야 하는 부담감이 있습니다.

반응형
Posted by 질주하는구
,

jpa-data 작업 중 No bean named 'transactionManager' available: No matching PlatformTransactionManager bean found for qualifier 'transactionManager' - neither qualifier match nor bean name match!

같은 에러가 발생시 transaction을 이미 지정한 경우 해당 트랜잭션의 id를 

 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">

같이 transactionManager로 지정 txManager등의 이름 사용시 해당 bean을 찾지 못하는 문제 발생

반응형
Posted by 질주하는구
,

JpaReposiory 사용 사 메소드 명으로 쿼리문을 작성 하는 경우 아래와 같은 형식으로 정의 할 수 있습니다.

 

1) findByXX ex>findByParentDataSeq 와 같이 ParentDataSeq 값을 기준으로 데이터를 검색 하고자 하는 경우 findBy 이후에 ParentDataSeq 컬럼을 명시해서 관련 쿼리문이 나오게  할 수 있습니다.


2) Like / NotLike ex> findByFileNameLike 와 같이 FileName, Like 를 붙여 주면 FileName 기준으로 like 검색을 쿼리문을 생성 해줍니다.


3) StartingWith / EndingWith ex> findByFileNameStartingWith("2021년") 와 같이 FileName 과 StartingWith 를 붙여 주면 FileName 에 '2021년' 으로 시작하는 데이터만 검색 하게 됩니다.
file명으로 검색 하는 경우 EndingWith(".jpg") 와 같이 확장자 기준으로 데이터를 가지고 오는데 사용하는게 유용 합니다.


4) IsNull / IsNotNull ex> findByFileNameIsNull() FileName 와 IsNull 을 같이 사용하는 경우 FILE_NAME이 NULL인 데이터만 조회 합니다.


5) True / False ex> findByFileCheckTrue 라면 FILE_CHECK컬럼이 값이 true인 경우에만 데이터를 조회 합니다. 컬럼 형식이 boolean인 경우 사용 할 수 있습니다.


6) Before / After  ex> findByRegDateBefore(new Date()) 인 경우 REG_DATE컬럼이 넘겨받는 new Date() 기분으로 이전 날짜인 경우에만 데이터를 조회 합니다. date, datetime 형식 인경우 사용 가능 합니다.


7) LessThan / GreaterThan ex> findByFileSeqLessThan(20) FILE_SEQ 컬럼의 값이 20보다 작은 데이터만 조회 합니다. (GreaterThan는 더 큰수만 조회 합니다.) number 형식인 경우 사용 가능 합니다.


8) Between ex> findByFileSeqBetween(10,20) FILE_SEQ의 값이 10~20사이인 데이터만 조회 합니다. BETWEEN 함수를 사용하는 것과 동일 합니다.(number, daste 형식인 경우 사용 가능 합니다.

 

9) And / OR ex> findByParentDataSeqAndFuncType(Integer parentDataSeq, String funcType) 같이 조건을 여러개 붙이는 경우 중간에 And, OR를 붙여서 데이터 조회를 할 수 있습니다.

반응형
Posted by 질주하는구
,