package demo;
import com.jaxio.jpa.querybyexample.*;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
import javax.inject.Inject;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import static org.hamcrest.CoreMatchers.is;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:applicationContext.xml"})
@Transactional
public class AccountQueryByExampleTest {
@Inject
AccountRepository accountRepository;
@Test
@Rollback
public void simpleQueryOnLastName() throws Exception {
Account example = new Account().lastName("Jagger");
//SearchParameters sp = new SearchParameters().caseInsensitive();
List<Account> result = accountRepository.find(example);
Assert.assertThat(result.get(0).getUsername(), is("mick"));
}
@Test
@Rollback
public void simpleQueryOnLastNameCaseInsensitiveWithOrderBy() throws Exception {
Account example = new Account().lastName("Jagger");
example.setLastName("Jagger");
SearchParameters sp = new SearchParameters().caseInsensitive().orderBy(OrderByDirection.ASC, Account_.lastName);
List<Account> result = accountRepository.find(example, sp);
Assert.assertThat(result.get(0).getUsername(), is("mick"));
}
@Test
@Rollback
public void simpleQueryOnLastNameWithOrderByAndPagination() throws Exception {
Account example = new Account();
example.setLastName("Jagger");
SearchParameters sp = new SearchParameters().orderBy(OrderByDirection.ASC, Account_.lastName) //
.first(50).maxResults(25);
List<Account> result = accountRepository.find(example, sp);
Assert.assertThat(result.size(), is(0));
}
@Test
@Rollback
public void simpleQueryOnLastNameWithLike() throws Exception {
Account example = new Account();
example.setLastName("Jag");
SearchParameters sp = new SearchParameters().startingLike();
List<Account> result = accountRepository.find(example, sp);
Assert.assertThat(result.size(), is(1));
}
@Test
@Rollback
public void simpleQueryOnSeveralFields_AND() throws Exception {
Account example = new Account();
example.setLastName("Jag");
example.setBirthDate(new Date());
SearchParameters sp = new SearchParameters().orderBy(OrderByDirection.ASC, Account_.lastName).startingLike();
List<Account> result = accountRepository.find(example, sp);
Assert.assertThat(result.size(), is(0));
}
@Test
@Rollback
public void simpleQueryOnSeveralFields_OR() throws Exception {
Account example = new Account();
example.setLastName("Jag");
example.setBirthDate(new Date());
SearchParameters sp = new SearchParameters().orMode().orderBy(OrderByDirection.ASC, Account_.lastName).startingLike();
List<Account> result = accountRepository.find(example, sp);
Assert.assertThat(result.size(), is(1));
}
@Test
@Rollback
public void dateRangeQuery() throws Exception {
Account example = new Account();
example.setLastName("Jagger");
Calendar from = Calendar.getInstance();
from.set(1940, 0, 1);
Calendar to = Calendar.getInstance();
to.set(1945, 11, 31);
Range<Account, Date> birthDateRange = Range.newRange(Account_.birthDate);
birthDateRange.from(from.getTime()).to(to.getTime());
SearchParameters sp = new SearchParameters().range(birthDateRange);
List<Account> result = accountRepository.find(example, sp);
Assert.assertThat(result.size(), is(1));
Assert.assertThat(result.get(0).getUsername(), is("mick"));
System.out.println("******************************************");
System.out.println(result.get(0));
System.out.println("******************************************");
}
@Test
@Rollback
public void dateRangeQueryVariation() throws Exception {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date from = dateFormat.parse("1920-12-01");
Date to = dateFormat.parse("1974-12-01");
SearchParameters sp = new SearchParameters().range(from, to, Account_.birthDate);
List<Account> accountList = accountRepository.find(sp);
Assert.assertThat(accountList.size(), is(4));
}
@Test
@Rollback
public void dateRangeAndLikeQuery() throws Exception {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date from = dateFormat.parse("1920-12-01");
Date to = dateFormat.parse("2020-12-01");
SearchParameters sp = new SearchParameters().range(from, to, Account_.birthDate);
sp.anywhere(); // enable search like '%...%'
Account example = new Account();
example.setUsername("i"); // will search username Like '%i%'
List<Account> accountList = accountRepository.find(example, sp);
System.out.println("******************************************");
for (Account a : accountList) {
System.out.println(a);
}
System.out.println("******************************************");
}
@Test
@Rollback
public void matchAllStringProperty() throws Exception {
SearchParameters sp = new SearchParameters().searchMode(SearchMode.STARTING_LIKE).searchPattern("Jag");
List<Account> result = accountRepository.find(sp);
Assert.assertThat(result.size(), is(1));
Assert.assertThat(result.get(0).getUsername(), is("mick"));
}
@Test
@Rollback
public void propertySelectorOnLastName() throws Exception {
PropertySelector<Account, String> lastNameSelector = PropertySelector.newPropertySelector(Account_.lastName);
lastNameSelector.setSelected(Arrays.asList("Jagger", "Richards", "Jones", "Watts", "taylor", "Wyman", "Wood"));
SearchParameters sp = new SearchParameters().property(lastNameSelector);
List<Account> result = accountRepository.find(sp);
Assert.assertThat(result.size(), is(3));
}
@Test
@Rollback
public void queryInvolvingManyToOne() throws Exception {
Account example = new Account();
example.setHomeAddress(new Address());
example.getHomeAddress().setCity("Paris");
List<Account> result = accountRepository.find(example);
Assert.assertThat(result.size(), is(2));
}
}