Test

JpaBeanRepositoryTest.java #1

package com.u2ware.springfield.sample.part1;

import lombok.Getter;
import lombok.Setter;

public class FindByIdAndPasswordOrderByNameDesc {

	@Getter @Setter public String id;
	@Getter @Setter public String password;
}
		
public class JpaBeanRepositoryTest extends ApplicationContextTestRoot{

	.
	.

	@Test
	public void testFindByEntityQueryObject1() throws Exception{
		
		FindByIdAndPasswordOrderByNameDesc query 
			= new FindByIdAndPasswordOrderByNameDesc();
		query.setPassword("pwd7");
		
		List<?> result = jpaBeanRepository.findAll(query);
		Assert.assertEquals(1, result.size());
	}
}
		
Note:

findAll() 에 전달되는 객체의 class name 이 "FindByIdAndPasswordOrderByNameDesc" 이므로, 이를 기본 Query Method 문자열로 한다.

testFindByEntityQueryObject1() 에서 id 는 null 이고, password 거 null 이 아니므로 "password = ?" 가 where 조건으로 추가되고, name 의 내림차순(DESC)으로 "order by name desc" 가 질의에 추가된다.

JpaBeanRepositoryTest.java #2

package com.u2ware.springfield.sample.part1;

import com.u2ware.springfield.repository.QueryMethod;

import lombok.Getter;
import lombok.Setter;

@QueryMethod("findByNameAndAgeOrderByIdAsc")
public class MyQuery {

	@Getter @Setter public String name;	
	@Getter @Setter public Integer age;
}
		
public class JpaBeanRepositoryTest extends ApplicationContextTestRoot{

	.
	.

	@Test
	public void testFindByEntityQueryObject2() throws Exception{
		
		MyQuery query = new MyQuery();
		query.setName("name5");
		
		List<?> result = jpaBeanRepository.findAll(query);
		Assert.assertEquals(1, result.size());
	}
}
		
Note:

findAll() 에 전달되는 객체의 @QueryMethod 선언값이 "findByNameAndAddressOrderByIdAsc" 이므로, 이를 기본 Query Method 문자열로 한다.

testFindByEntityQueryObject2() 에서 name 은 null 이 아니고, address 는 null 이므로 "name = ?" 가 where 조건으로 추가되고, id 의 오림차순(ASC)으로 "order by id asc" 가 질의에 추가된다.

QueryMethod

public interface EntityRepository<T, ID extends Serializable> {
	.	
	.	
	public long count(Object query);
	public List<T> findAll(Object query);
	public List<T> findAll(Object query, Sort sort);
	public Page<T> findAll(Object query, Pageable pageable);
}
		
Query Method:

EntityRepository 의 count() 및 findAll() 의 query 인자를 Entity Query Object 라고 명명 한다.

Entity Query Object 의 Class Name 또는 선언된 @com.u2ware.springfield.repository.QueryMethod 에 따라 Query Method 문자열이 결정되며,
Query Method 문자열을 기준으로 Entity Query Object 의 property 값의 null 여부에 따라 where 조건 및 order 조건이 동적으로 결정된다.

 

Note:

SQLSESSION 전략에서 Query Method 문자열은 sqlsession.xml 에 미리정의된 mapping query statement 를 의미한다.

JPA 전략에서 Query Method문자열은 "findBy~" 로 시작하는 spring-data JPA Query Method를 따른다.

MONGODB 전략에서 Query Method문자열은 "findBy~" 로 시작하는 spring-data mongodb Query Method 를 따른다.