Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Expand
title샘플데이터만들기


Address 데이터를 만드는것은 앞장에서 이미 설명이 되었으며

Address2는 Address데이터에서, 데이터만 약간 변형이 되었습니다.

순차적으로 기술되었기때문에 이해하는데 어려움은 없을듯 보입니다.

Code Block
languagejava
themeEmacs
public void InsertAddressData(){		
	String[] addArray = {
			"서울","대구","부산","창원","마산","제주"				
	};			
	for(int i=0; i<100;i++) {
		Boolean isAddRepo2 = false;
		double random = Math.random();
	    double x = random*100;
	    int y = (int)x + 1; //Add 1 to change the range to 1 - 100 instead of 0 - 99
	    
		Address address = new Address();
		Address2 address2 = new Address2();
		
		address.setAge(y);
		address.setAddress( addArray[i%6] );
		address.setPhoneNbr(String.format("010-3333-1%04d", i));			
		
		if( i%2 == 0 ) {
			address.setName(String.format("민수%d", i+1));
			address.setSex("남");
			//Address2에는 민수가 중복존재함
			isAddRepo2 = true;
			address2.setName(String.format("민수%d", i+1));
			address2.setSex("남");
			address2.setAge(y);
			address2.setAddress( addArray[i%6] );
			address2.setPhoneNbr(String.format("010-3333-1%04d", i));				
		}else {
			address.setName(String.format("영희%d", i+1));
			address.setSex("여");
			//Address2에는 여자가 없음
			isAddRepo2 = false;
		}
		
		if( i%3 == 0) {
			//Address2에는 철수만 있음
			isAddRepo2 = true;
			address2.setName(String.format("철수%d", i+1));
			address2.setSex("남");
			address2.setAge(y);
			address2.setAddress( addArray[i%6] );
			//철수의 전화번호는 다름
			address2.setPhoneNbr(String.format("010-2222-1%04d", i));
		}					
		addressRepo.save(address);
		if(isAddRepo2==true) addressRepo2.save(address2);		
	}					
}
Address1Address2

Image Modified

100개

Image Modified

67개

 


순수 프로필정보를 가지고 중복체크 여부를 확인하기위한 샘플이며

...

이것은, 짝수번째(3의배수가 짝수번째가되는상황제외)에서 복제를 하였기때문에 중복을 제거한 합이기 때문입니다.


그럼 UNION수행이 JPA에서는 어떻게 작동되는지 확인해보겠습니다.


JPA에서 UNION 사용하기

아쉽게도 JPQL에서 UNION쿼리를 지원하지 않으며, 유니온된 결과는  기존 Entity와 다르기 때문에,결과 역시Entity에 정의하지 않은

새로운 튜플이기 때문에, 맵핑이 불가능한것은 아니나 어려움이 있습니다. 이때는 SQL Native 쿼리 방식을 사용해야하며

만족스럽지는 못하지만  오브젝트를 못하지만 맵핑에도 어려움이 있어서오브젝트를 변환하는 전통적인 방법을 그대로 사용해해보겠습니다.

JPA에서 UNION 사용하기
Code Block
languagejava
themeEmacs
public interface AddressRepo2 extends CrudRepository<Address2, Long>{	
	@Query(value="SELECT address,age,name,phoneNbr,sex FROM db_example.address " + 
			"UNION " + 
			"SELECT address,age,name,phoneNbr,sex FROM db_example.address2 ",
			nativeQuery = true)
	List<?> makeUniOn();	//이 함수를 통해, UNION의 결과를 볼수가 있습니다.
}


List<?> addressUnion =  addressRepo2.makeUniOn();
ObjectMapper mapper = new ObjectMapper();
addressUnion.forEach( item ->{
	try {
		String jsonInString = mapper.writeValueAsString(item);
		System.out.println(jsonInString);				
	}catch(Exception e) {				
	}
});


결과:

Image Modified

Image Modified

사용방식에 만족스럽진 못하지만, 동일한 기능을, JPA Repository 인터페이스를 통해 활용하여 수행하였습니다.



교집합 구하기

Code Block
languagesql
themeEmacs
SELECT address,age,name,phoneNbr,sex FROM db_example.address
INTERSECT
SELECT address,age,name,phoneNbr,sex FROM db_example.address2;

...