package org.raidenjpa.query.join; import static org.junit.Assert.assertEquals; import java.util.List; import org.junit.Before; import org.junit.Test; import org.raidenjpa.AbstractTestCase; import org.raidenjpa.entities.A; import org.raidenjpa.entities.B; import org.raidenjpa.entities.ItemA; import org.raidenjpa.util.QueryHelper; public class JoinTest extends AbstractTestCase { @Before public void setUp() { super.setUp(); createABC(); } @SuppressWarnings("unchecked") @Test public void testInnerToOne() { createAB("a2", "b2"); createA("a3"); QueryHelper query = new QueryHelper("SELECT a, b FROM A a JOIN a.b b"); List<Object[]> result = (List<Object[]>) query.getResultList(); assertEquals(2, result.size()); assertEquals("a1", ((A) result.get(0)[0]).getStringValue()); assertEquals("b1", ((B) result.get(0)[1]).getValue()); assertEquals("a2", ((A) result.get(1)[0]).getStringValue()); assertEquals("b2", ((B) result.get(1)[1]).getValue()); } @SuppressWarnings("unchecked") @Test public void testInnerToMany() { createAwithItens("a2", 2); createAwithItens("a3", 3); QueryHelper query = new QueryHelper("SELECT a, item FROM A a JOIN a.itens item"); List<Object[]> result = (List<Object[]>) query.getResultList(); assertEquals(5, result.size()); assertEquals("a2", ((A) result.get(0)[0]).getStringValue()); assertEquals("a2.1", ((ItemA) result.get(0)[1]).getValue()); assertEquals("a2", ((A) result.get(1)[0]).getStringValue()); assertEquals("a2.2", ((ItemA) result.get(1)[1]).getValue()); assertEquals("a3", ((A) result.get(2)[0]).getStringValue()); assertEquals("a3.1", ((ItemA) result.get(2)[1]).getValue()); assertEquals("a3", ((A) result.get(3)[0]).getStringValue()); assertEquals("a3.2", ((ItemA) result.get(3)[1]).getValue()); } @Test public void testJoinFetchSimple() { createAwithItens("a2", 2); createAwithItens("a3", 3); QueryHelper query = new QueryHelper("SELECT DISTINCT a FROM A a LEFT JOIN FETCH a.itens"); List<?> result = query.getResultList(); assertEquals(3, result.size()); assertEquals("a1", ((A) result.get(0)).getStringValue()); assertEquals("a2", ((A) result.get(1)).getStringValue()); assertEquals("a3", ((A) result.get(2)).getStringValue()); } @Test public void testJoinFetchAndWhere() { createAwithItens("a2", 2); createAwithItens("a3", 3); QueryHelper query = new QueryHelper("SELECT DISTINCT a FROM A a LEFT JOIN FETCH a.itens WHERE a.stringValue = :value"); query.parameter("value", "a2"); List<?> result = query.getResultList(); for (Object r : result) { System.err.println(((A) r).getStringValue()); } assertEquals(1, result.size()); assertEquals("a2", ((A) result.get(0)).getStringValue()); } @SuppressWarnings("unchecked") @Test public void testTwoJoins() { createAB("a2", 3, "b2"); createA("a3"); createB("b3"); createAB("a4", 2, "b4"); StringBuilder jpql = new StringBuilder(); jpql.append("SELECT a, b, item FROM A a"); jpql.append(" JOIN a.b b"); jpql.append(" JOIN a.itens item"); QueryHelper query = new QueryHelper(jpql); List<Object[]> result = (List<Object[]>) query.getResultList(); assertEquals(5, result.size()); assertEquals("a2", ((A) result.get(0)[0]).getStringValue()); assertEquals("b2", ((B) result.get(0)[1]).getValue()); assertEquals("a2.1", ((ItemA) result.get(0)[2]).getValue()); assertEquals("a4", ((A) result.get(4)[0]).getStringValue()); assertEquals("b4", ((B) result.get(4)[1]).getValue()); assertEquals("a4.2", ((ItemA) result.get(4)[2]).getValue()); } @Test public void testJoinToOneAndWithClause() { StringBuilder jpql = new StringBuilder(); jpql.append("SELECT a, b FROM A a"); jpql.append(" JOIN a.b b with b.value = :value"); QueryHelper query = new QueryHelper(jpql); query.parameter("value", "b1"); assertEquals(1, query.getResultList().size()); jpql = new StringBuilder(); jpql.append("SELECT a, b FROM A a"); jpql.append(" JOIN a.b b with b.value = :value"); query = new QueryHelper(jpql); query.parameter("value", "wrongValue"); assertEquals(0, query.getResultList().size()); } @SuppressWarnings("unchecked") @Test public void testJoinToManyAndWithClause() { createAwithItens("a2", 3); StringBuilder jpql; QueryHelper query; List<Object[]> result; jpql = new StringBuilder(); jpql.append("SELECT a, i FROM A a"); jpql.append(" JOIN a.itens i with i.value = :itemValue"); query = new QueryHelper(jpql); query.parameter("itemValue", "a2.1"); result = (List<Object[]>) query.getResultList(); assertEquals(1, result.size()); assertEquals("a2.1", ((ItemA) result.get(0)[1]).getValue()); } @Test public void testJoinClauseWithAndParentheses() { } public void testInnerWithList() { } public void testLeft() { } public void testWith() { } }