Search in sources :

Example 6 with Bid

use of org.jpwh.model.querying.Bid in project microservices by pwillhan.

the class Restriction method executeQueries.

@Test
public void executeQueries() throws Exception {
    TestDataCategoriesItems testData = storeTestData();
    CriteriaBuilder cb = JPA.getEntityManagerFactory().getCriteriaBuilder();
    UserTransaction tx = TM.getUserTransaction();
    try {
        tx.begin();
        EntityManager em = JPA.createEntityManager();
        {
            // select i from Item i where i.name = 'Foo'
            CriteriaQuery criteria = cb.createQuery();
            Root<Item> i = criteria.from(Item.class);
            criteria.select(i).where(cb.equal(i.get("name"), "Foo"));
            TypedQuery<Item> q = em.createQuery(criteria);
            assertEquals(q.getResultList().size(), 1);
            assertEquals(q.getResultList().iterator().next().getName(), "Foo");
        }
        em.clear();
        {
            // Equals boolean
            CriteriaQuery criteria = cb.createQuery();
            Root<User> u = criteria.from(User.class);
            criteria.select(u).where(cb.equal(u.get("activated"), true));
            Query q = em.createQuery(criteria);
            assertEquals(q.getResultList().size(), 2);
        }
        em.clear();
        {
            // Between
            CriteriaQuery criteria = cb.createQuery();
            Root<Bid> b = criteria.from(Bid.class);
            criteria.select(b).where(cb.between(// Type of path required!
            b.<BigDecimal>get("amount"), // Must be same type!
            new BigDecimal("99"), // Must be same type!
            new BigDecimal("110")));
            Query q = em.createQuery(criteria);
            assertEquals(q.getResultList().size(), 3);
        }
        em.clear();
        {
            // Greater than
            CriteriaQuery criteria = cb.createQuery();
            Root<Bid> b = criteria.from(Bid.class);
            criteria.select(b).where(// gt() only works with Number, use greaterThan() otherwise!
            cb.gt(b.<BigDecimal>get("amount"), new BigDecimal("100")));
            Query q = em.createQuery(criteria);
            assertEquals(q.getResultList().size(), 1);
        }
        em.clear();
        {
            // Greater than with date (!Number)
            Date tomorrowDate = CalendarUtil.TOMORROW.getTime();
            CriteriaQuery criteria = cb.createQuery();
            Root<Item> i = criteria.from(Item.class);
            criteria.select(i).where(cb.greaterThan(i.<Date>get("auctionEnd"), tomorrowDate));
            Query q = em.createQuery(criteria);
            assertEquals(q.getResultList().size(), 1);
        }
        em.clear();
        {
            // IN list
            CriteriaQuery criteria = cb.createQuery();
            Root<User> u = criteria.from(User.class);
            criteria.select(u).where(cb.<String>in(u.<String>get("username")).value("johndoe").value("janeroe"));
            Query q = em.createQuery(criteria);
            assertEquals(q.getResultList().size(), 2);
        }
        em.clear();
        {
            // Enum
            CriteriaQuery criteria = cb.createQuery();
            Root<Item> i = criteria.from(Item.class);
            criteria.select(i).where(cb.equal(i.<AuctionType>get("auctionType"), AuctionType.HIGHEST_BID));
            Query q = em.createQuery(criteria);
            assertEquals(q.getResultList().size(), 3);
        }
        em.clear();
        {
            // Ternary operators
            CriteriaQuery criteria = cb.createQuery();
            Root<Item> i = criteria.from(Item.class);
            criteria.select(i).where(cb.isNull(i.get("buyNowPrice")));
            Query q = em.createQuery(criteria);
            assertEquals(q.getResultList().size(), 2);
        }
        em.clear();
        {
            CriteriaQuery criteria = cb.createQuery();
            Root<Item> i = criteria.from(Item.class);
            criteria.select(i).where(cb.isNotNull(i.get("buyNowPrice")));
            Query q = em.createQuery(criteria);
            assertEquals(q.getResultList().size(), 1);
        }
        em.clear();
        {
            // String matching
            CriteriaQuery criteria = cb.createQuery();
            Root<User> u = criteria.from(User.class);
            criteria.select(u).where(cb.like(u.<String>get("username"), "john%"));
            Query q = em.createQuery(criteria);
            assertEquals(q.getResultList().size(), 1);
        }
        {
            // String matching
            CriteriaQuery criteria = cb.createQuery();
            Root<User> u = criteria.from(User.class);
            criteria.select(u).where(cb.like(u.<String>get("username"), "john%").not());
            Query q = em.createQuery(criteria);
            assertEquals(q.getResultList().size(), 2);
        }
        em.clear();
        {
            CriteriaQuery criteria = cb.createQuery();
            Root<User> u = criteria.from(User.class);
            criteria.select(u).where(cb.like(u.<String>get("username"), "%oe%"));
            Query q = em.createQuery(criteria);
            assertEquals(q.getResultList().size(), 3);
        }
        em.clear();
        {
            CriteriaQuery criteria = cb.createQuery();
            Root<Item> i = criteria.from(Item.class);
            criteria.select(i).where(cb.like(i.<String>get("name"), "Name\\_with\\_underscores", '\\'));
            Query q = em.createQuery(criteria);
            assertEquals(q.getResultList().size(), 0);
        }
        em.clear();
        {
            // Arithmetic
            CriteriaQuery criteria = cb.createQuery();
            Root<Bid> b = criteria.from(Bid.class);
            criteria.select(b).where(cb.gt(cb.diff(cb.quot(b.<BigDecimal>get("amount"), 2), 0.5), 49));
            Query q = em.createQuery(criteria);
            assertEquals(q.getResultList().size(), 2);
        }
        em.clear();
        {
            // Logical groups
            CriteriaQuery criteria = cb.createQuery();
            Root<Item> i = criteria.from(Item.class);
            Predicate predicate = cb.and(cb.like(i.<String>get("name"), "Fo%"), cb.isNotNull(i.get("buyNowPrice")));
            predicate = cb.or(predicate, cb.equal(i.<String>get("name"), "Bar"));
            criteria.select(i).where(predicate);
            Query q = em.createQuery(criteria);
            assertEquals(q.getResultList().size(), 2);
        }
        em.clear();
        {
            CriteriaQuery criteria = cb.createQuery();
            Root<Item> i = criteria.from(Item.class);
            criteria.select(i).where(cb.like(i.<String>get("name"), "Fo%"), // AND
            cb.isNotNull(i.get("buyNowPrice")));
            Query q = em.createQuery(criteria);
            assertEquals(q.getResultList().size(), 1);
        }
        em.clear();
        {
            // Collection functions
            CriteriaQuery criteria = cb.createQuery();
            Root<Category> c = criteria.from(Category.class);
            criteria.select(c).where(cb.isNotEmpty(c.<Collection>get("items")));
            Query q = em.createQuery(criteria);
            assertEquals(q.getResultList().size(), 2);
        }
        em.clear();
        {
            // Collection functions
            CriteriaQuery criteria = cb.createQuery();
            Root<Category> c = criteria.from(Category.class);
            criteria.select(c).where(cb.isMember(cb.parameter(Item.class, "item"), c.<Collection<Item>>get("items")));
            Query q = em.createQuery(criteria);
            Item item = em.find(Item.class, testData.items.getFirstId());
            q.setParameter("item", item);
            List<Category> result = q.getResultList();
            assertEquals(result.size(), 1);
        }
        em.clear();
        {
            // Collection functions
            CriteriaQuery criteria = cb.createQuery();
            Root<Category> c = criteria.from(Category.class);
            criteria.select(c).where(cb.gt(cb.size(c.<Collection>get("items")), 1));
            Query q = em.createQuery(criteria);
            assertEquals(q.getResultList().size(), 1);
        }
        em.clear();
        {
            // Calling functions
            CriteriaQuery criteria = cb.createQuery();
            Root<Item> i = criteria.from(Item.class);
            criteria.select(i).where(cb.like(cb.lower(i.<String>get("name")), "ba%"));
            Query q = em.createQuery(criteria);
            assertEquals(q.getResultList().size(), 2);
        }
        em.clear();
        {
            // Ordering result
            CriteriaQuery criteria = cb.createQuery();
            Root<User> u = criteria.from(User.class);
            criteria.select(u).orderBy(cb.desc(u.get("username")));
            Query q = em.createQuery(criteria);
            assertEquals(q.getResultList().size(), 3);
        }
        em.clear();
        {
            // Ordering result
            CriteriaQuery criteria = cb.createQuery();
            Root<User> u = criteria.from(User.class);
            criteria.select(u).orderBy(cb.desc(u.get("activated")), cb.asc(u.get("username")));
            Query q = em.createQuery(criteria);
            assertEquals(q.getResultList().size(), 3);
        }
        tx.commit();
        em.close();
    } finally {
        TM.rollback();
    }
}
Also used : CriteriaBuilder(javax.persistence.criteria.CriteriaBuilder) UserTransaction(javax.transaction.UserTransaction) User(org.jpwh.model.querying.User) Category(org.jpwh.model.querying.Category) Root(javax.persistence.criteria.Root) CriteriaQuery(javax.persistence.criteria.CriteriaQuery) TypedQuery(javax.persistence.TypedQuery) Query(javax.persistence.Query) TypedQuery(javax.persistence.TypedQuery) CriteriaQuery(javax.persistence.criteria.CriteriaQuery) BigDecimal(java.math.BigDecimal) Date(java.util.Date) Predicate(javax.persistence.criteria.Predicate) Item(org.jpwh.model.querying.Item) EntityManager(javax.persistence.EntityManager) Collection(java.util.Collection) List(java.util.List) Bid(org.jpwh.model.querying.Bid) Test(org.testng.annotations.Test) QueryingTest(org.jpwh.test.querying.QueryingTest)

Example 7 with Bid

use of org.jpwh.model.querying.Bid in project microservices by pwillhan.

the class Projection method executeQueries.

@Test
public void executeQueries() throws Exception {
    TestDataCategoriesItems testData = storeTestData();
    UserTransaction tx = TM.getUserTransaction();
    try {
        tx.begin();
        EntityManager em = JPA.createEntityManager();
        {
            Query query = em.createNamedQuery("product");
            List<Object[]> result = query.getResultList();
            Set<Item> items = new HashSet();
            Set<Bid> bids = new HashSet();
            for (Object[] row : result) {
                assertTrue(row[0] instanceof Item);
                items.add((Item) row[0]);
                assertTrue(row[1] instanceof Bid);
                bids.add((Bid) row[1]);
            }
            assertEquals(items.size(), 3);
            assertEquals(bids.size(), 4);
            // Cartesian product!
            assertEquals(result.size(), 12);
        }
        em.clear();
        {
            Query q = em.createNamedQuery("scalarProduct");
            List<Object[]> result = q.getResultList();
            assertEquals(result.size(), 3);
            Set<Long> ids = new HashSet();
            Set<String> names = new HashSet();
            Set<BigDecimal> prices = new HashSet();
            for (Object[] row : result) {
                assertTrue(row[0] instanceof Long);
                ids.add((Long) row[0]);
                assertTrue(row[1] instanceof String);
                names.add((String) row[1]);
                assertTrue(row[2] == null || row[2] instanceof BigDecimal);
                prices.add((BigDecimal) row[2]);
            }
            assertEquals(ids.size(), 3, "ids");
            assertEquals(names.size(), 3, "names");
            assertEquals(prices.size(), 2, "prices");
        }
        em.clear();
        {
            Query q = em.createNamedQuery("transient");
            List<Object[]> result = q.getResultList();
            assertEquals(result.size(), 3);
            Object[] firstRow = result.get(0);
            assertTrue(firstRow[0] instanceof Long);
            assertTrue(firstRow[1] instanceof String);
            assertTrue(firstRow[2] instanceof Address);
        }
        em.clear();
        {
            Query q = em.createNamedQuery("distinct");
            assertEquals(q.getResultList().size(), 3);
        }
        em.clear();
        {
            Query q = em.createNamedQuery("dynamicInstance");
            List<ItemSummary> result = q.getResultList();
            assertEquals(result.size(), 3);
        }
        // All following are more function call examples, with variations
        em.clear();
        {
            Query q = em.createNamedQuery("concat");
            assertEquals(q.getResultList().size(), 3);
        }
        em.clear();
        {
            Query q = em.createNamedQuery("coalesce");
            List<Object[]> result = q.getResultList();
            assertEquals(result.size(), 3);
            for (Object[] row : result) {
                assertTrue(row[0] instanceof String);
                // Never NULL!
                assertTrue(row[1] instanceof BigDecimal);
            }
        }
        em.clear();
        {
            Query q = em.createNamedQuery("caseWhen");
            List<Object[]> result = q.getResultList();
            assertEquals(result.size(), 3);
            for (Object[] row : result) {
                assertTrue(row[0] instanceof String);
                assertTrue(row[1] instanceof String);
            }
        }
        em.clear();
        {
            Query query = em.createNamedQuery("count");
            Long count = (Long) query.getSingleResult();
            assertEquals(count, new Long(3));
        }
        em.clear();
        {
            Query q = em.createNamedQuery("countDistinct");
            Long count = (Long) q.getSingleResult();
            assertEquals(count, new Long(3));
        }
        em.clear();
        {
            Query q = em.createNamedQuery("sum");
            BigDecimal sum = (BigDecimal) q.getSingleResult();
            assertEquals(sum.toString(), "304.99");
        }
        em.clear();
        {
            Query q = em.createNamedQuery("minMax");
            q.setParameter("itemId", testData.items.getFirstId());
            Object[] result = (Object[]) q.getSingleResult();
            assertEquals(((BigDecimal) result[0]).compareTo(new BigDecimal("99")), 0);
            assertEquals(((BigDecimal) result[1]).compareTo(new BigDecimal("101")), 0);
        }
        em.clear();
        tx.commit();
        em.close();
    } finally {
        TM.rollback();
    }
}
Also used : UserTransaction(javax.transaction.UserTransaction) Set(java.util.Set) HashSet(java.util.HashSet) Query(javax.persistence.Query) Address(org.jpwh.model.querying.Address) BigDecimal(java.math.BigDecimal) Item(org.jpwh.model.querying.Item) EntityManager(javax.persistence.EntityManager) List(java.util.List) Bid(org.jpwh.model.querying.Bid) HashSet(java.util.HashSet) Test(org.testng.annotations.Test) QueryingTest(org.jpwh.test.querying.QueryingTest)

Example 8 with Bid

use of org.jpwh.model.querying.Bid in project microservices by pwillhan.

the class HibernateCriteria method foo.

@Test
public void foo() throws Exception {
    TestDataCategoriesItems testData = storeTestData();
    UserTransaction tx = TM.getUserTransaction();
    try {
        tx.begin();
        EntityManager em = JPA.createEntityManager();
        Session session = em.unwrap(Session.class);
        {
            List<Object[]> result = session.createCriteria(Bid.class, "b").createAlias("item", "i", JoinType.RIGHT_OUTER_JOIN).add(Restrictions.or(Restrictions.isNull("b.id"), Restrictions.gt("amount", new BigDecimal(100)))).setResultTransformer(Criteria.PROJECTION).list();
            assertEquals(result.size(), 2);
            // Criteria quirk: the root entity alias is always last in the result tuple
            assertTrue(result.get(0)[0] instanceof Item);
            assertTrue(result.get(0)[1] instanceof Bid);
            assertTrue(result.get(1)[0] instanceof Item);
            assertEquals(result.get(1)[1], null);
        }
        em.clear();
        tx.commit();
        em.close();
    } finally {
        TM.rollback();
    }
}
Also used : UserTransaction(javax.transaction.UserTransaction) Item(org.jpwh.model.querying.Item) EntityManager(javax.persistence.EntityManager) ArrayList(java.util.ArrayList) List(java.util.List) Bid(org.jpwh.model.querying.Bid) BigDecimal(java.math.BigDecimal) Session(org.hibernate.Session) Test(org.testng.annotations.Test) QueryingTest(org.jpwh.test.querying.QueryingTest)

Example 9 with Bid

use of org.jpwh.model.querying.Bid in project microservices by pwillhan.

the class Projection method executeQueries.

@Test
public void executeQueries() throws Exception {
    TestDataCategoriesItems testData = storeTestData();
    CriteriaBuilder cb = JPA.getEntityManagerFactory().getCriteriaBuilder();
    UserTransaction tx = TM.getUserTransaction();
    try {
        tx.begin();
        EntityManager em = JPA.createEntityManager();
        {
            // Product
            CriteriaQuery criteria = cb.createQuery();
            Root<Item> i = criteria.from(Item.class);
            Root<Bid> b = criteria.from(Bid.class);
            criteria.select(cb.tuple(i, b));
            /* Convenient alternative:
                criteria.multiselect(
                    criteria.from(Item.class),
                    criteria.from(Bid.class)
                );
                */
            Query q = em.createQuery(criteria);
            List<Object[]> result = q.getResultList();
            // Cartesian product!
            assertEquals(result.size(), 12);
            Set<Item> items = new HashSet();
            Set<Bid> bids = new HashSet();
            for (Object[] row : result) {
                assertTrue(row[0] instanceof Item);
                items.add((Item) row[0]);
                assertTrue(row[1] instanceof Bid);
                bids.add((Bid) row[1]);
            }
            assertEquals(items.size(), 3);
            assertEquals(bids.size(), 4);
        }
        em.clear();
        {
            // Transient result
            CriteriaQuery criteria = cb.createQuery();
            Root<User> u = criteria.from(User.class);
            // Returns List of Object[]
            criteria.multiselect(u.get("id"), u.get("username"), u.get("homeAddress"));
            Query q = em.createQuery(criteria);
            List<Object[]> result = q.getResultList();
            assertEquals(result.size(), 3);
            Object[] firstRow = result.get(0);
            assertTrue(firstRow[0] instanceof Long);
            assertTrue(firstRow[1] instanceof String);
            assertTrue(firstRow[2] instanceof Address);
        }
        em.clear();
        {
            // Distinct
            CriteriaQuery<String> criteria = cb.createQuery(String.class);
            criteria.select(criteria.from(Item.class).<String>get("name"));
            Query q = em.createQuery(criteria);
            assertEquals(q.getResultList().size(), 3);
        }
        em.clear();
        {
            // Distinct
            CriteriaQuery<String> criteria = cb.createQuery(String.class);
            criteria.select(criteria.from(Item.class).<String>get("name"));
            criteria.distinct(true);
            Query q = em.createQuery(criteria);
            assertEquals(q.getResultList().size(), 3);
        }
        em.clear();
        {
            // Dynamic instance creation
            CriteriaQuery criteria = cb.createQuery();
            Root<Item> i = criteria.from(Item.class);
            criteria.select(cb.construct(// Must have the right constructor!
            ItemSummary.class, i.get("id"), i.get("name"), i.get("auctionEnd")));
            Query q = em.createQuery(criteria);
            List<ItemSummary> result = q.getResultList();
            assertEquals(result.size(), 3);
        }
        em.clear();
        {
            // Tuple API
            CriteriaQuery<Tuple> criteria = cb.createTupleQuery();
            // Or: CriteriaQuery<Tuple> criteria = cb.createQuery(Tuple.class);
            criteria.multiselect(// Aliases optional!
            criteria.from(Item.class).alias("i"), criteria.from(Bid.class).alias("b"));
            TypedQuery<Tuple> query = em.createQuery(criteria);
            List<Tuple> result = query.getResultList();
            Set<Item> items = new HashSet();
            Set<Bid> bids = new HashSet();
            for (Tuple tuple : result) {
                // Indexed
                Item item = tuple.get(0, Item.class);
                Bid bid = tuple.get(1, Bid.class);
                // Alias
                item = tuple.get("i", Item.class);
                bid = tuple.get("b", Bid.class);
                // Meta
                for (TupleElement<?> element : tuple.getElements()) {
                    Class clazz = element.getJavaType();
                    String alias = element.getAlias();
                    Object value = tuple.get(element);
                }
                items.add(item);
                bids.add(bid);
            }
            // Cartesian product!
            assertEquals(result.size(), 12);
            assertEquals(items.size(), 3);
            assertEquals(bids.size(), 4);
        }
        em.clear();
        // All following are more function call examples, with variations
        {
            // Concat
            CriteriaQuery criteria = cb.createQuery();
            Root<Item> i = criteria.from(Item.class);
            criteria.select(cb.concat(cb.concat(i.<String>get("name"), ":"), // Note the cast of Date!
            i.<String>get("auctionEnd")));
            Query q = em.createQuery(criteria);
            assertEquals(q.getResultList().size(), 3);
        }
        em.clear();
        {
            // Coalesce
            CriteriaQuery criteria = cb.createQuery();
            Root<Item> i = criteria.from(Item.class);
            criteria.multiselect(i.get("name"), cb.coalesce(i.<BigDecimal>get("buyNowPrice"), 0));
            Query q = em.createQuery(criteria);
            List<Object[]> result = q.getResultList();
            assertEquals(result.size(), 3);
            for (Object[] row : result) {
                assertTrue(row[0] instanceof String);
                // Never NULL!
                assertTrue(row[1] instanceof BigDecimal);
            }
        }
        em.clear();
        {
        // Case When
        /*
                CriteriaQuery criteria = cb.createQuery();
                TODO String literals not supported, Hibernate bug HHH-8124
                Root<User> u = criteria.from(User.class);
                criteria.multiselect(
                    u.get("username"),
                    cb.selectCase()
                        .when(
                            cb.equal(
                                cb.length(u.get("homeAddress").<String>get("zipcode")), 5
                            ), "Germany"
                        )
                        .when(
                            cb.equal(
                                cb.length(u.get("homeAddress").<String>get("zipcode")), 4
                            ), "Switzerland"
                        )
                        .otherwise("Other")
                );

                Query q = em.createQuery(criteria);
                List<Object[]> result = q.getResultList();
                assertEquals(result.size(), 3);
                for (Object[] row : result) {
                    assertTrue(row[0] instanceof String);
                    assertTrue(row[1] instanceof String);
                }
                */
        }
        em.clear();
        {
            // Count
            CriteriaQuery criteria = cb.createQuery();
            criteria.select(cb.count(criteria.from(Item.class)));
            Query q = em.createQuery(criteria);
            Long count = (Long) q.getSingleResult();
            assertEquals(count, new Long(3));
        }
        em.clear();
        {
            // count(distinct ...)
            CriteriaQuery criteria = cb.createQuery();
            criteria.select(cb.countDistinct(criteria.from(Item.class).get("name")));
            Query q = em.createQuery(criteria);
            Long count = (Long) q.getSingleResult();
            assertEquals(count, new Long(3));
        }
        em.clear();
        {
            // Sum
            CriteriaQuery<Number> criteria = cb.createQuery(Number.class);
            criteria.select(cb.sum(criteria.from(Bid.class).<BigDecimal>get("amount")));
            Query q = em.createQuery(criteria);
            BigDecimal sum = (BigDecimal) q.getSingleResult();
            assertEquals(sum.compareTo(new BigDecimal("304.99")), 0);
        }
        em.clear();
        {
            // Min/Max
            CriteriaQuery criteria = cb.createQuery();
            Root<Bid> b = criteria.from(Bid.class);
            criteria.multiselect(cb.min(b.<BigDecimal>get("amount")), cb.max(b.<BigDecimal>get("amount")));
            criteria.where(cb.equal(b.get("item").<Long>get("id"), cb.parameter(Long.class, "itemId")));
            Query q = em.createQuery(criteria);
            q.setParameter("itemId", testData.items.getFirstId());
            Object[] result = (Object[]) q.getSingleResult();
            assertEquals(((BigDecimal) result[0]).compareTo(new BigDecimal("99")), 0);
            assertEquals(((BigDecimal) result[1]).compareTo(new BigDecimal("101")), 0);
        }
        em.clear();
        tx.commit();
        em.close();
    } finally {
        TM.rollback();
    }
}
Also used : CriteriaBuilder(javax.persistence.criteria.CriteriaBuilder) UserTransaction(javax.transaction.UserTransaction) Set(java.util.Set) HashSet(java.util.HashSet) User(org.jpwh.model.querying.User) Root(javax.persistence.criteria.Root) CriteriaQuery(javax.persistence.criteria.CriteriaQuery) TypedQuery(javax.persistence.TypedQuery) Query(javax.persistence.Query) Address(org.jpwh.model.querying.Address) TypedQuery(javax.persistence.TypedQuery) CriteriaQuery(javax.persistence.criteria.CriteriaQuery) BigDecimal(java.math.BigDecimal) Item(org.jpwh.model.querying.Item) EntityManager(javax.persistence.EntityManager) TupleElement(javax.persistence.TupleElement) List(java.util.List) Bid(org.jpwh.model.querying.Bid) Tuple(javax.persistence.Tuple) HashSet(java.util.HashSet) Test(org.testng.annotations.Test) QueryingTest(org.jpwh.test.querying.QueryingTest)

Example 10 with Bid

use of org.jpwh.model.querying.Bid in project microservices by pwillhan.

the class Subselects method executeQueries.

@Test
public void executeQueries() throws Exception {
    TestDataCategoriesItems testData = storeTestData();
    CriteriaBuilder cb = JPA.getEntityManagerFactory().getCriteriaBuilder();
    UserTransaction tx = TM.getUserTransaction();
    try {
        tx.begin();
        EntityManager em = JPA.createEntityManager();
        {
            // Correlated
            CriteriaQuery criteria = cb.createQuery();
            Root<User> u = criteria.from(User.class);
            Subquery<Long> sq = criteria.subquery(Long.class);
            Root<Item> i = sq.from(Item.class);
            sq.select(cb.count(i)).where(cb.equal(i.get("seller"), u));
            criteria.select(u);
            criteria.where(cb.greaterThan(sq, 1L));
            Query q = em.createQuery(criteria);
            List<User> result = q.getResultList();
            assertEquals(result.size(), 1);
            User user = result.iterator().next();
            assertEquals(user.getId(), testData.users.getFirstId());
        }
        em.clear();
        {
            // Uncorrelated
            CriteriaQuery criteria = cb.createQuery();
            Root<Bid> b = criteria.from(Bid.class);
            Subquery<BigDecimal> sq = criteria.subquery(BigDecimal.class);
            Root<Bid> b2 = sq.from(Bid.class);
            sq.select(cb.max(b2.<BigDecimal>get("amount")));
            criteria.select(b);
            criteria.where(cb.greaterThanOrEqualTo(cb.sum(b.<BigDecimal>get("amount"), new BigDecimal(1)), sq));
            Query q = em.createQuery(criteria);
            List<Bid> result = q.getResultList();
            assertEquals(result.size(), 2);
        }
        em.clear();
        {
            // Exists
            CriteriaQuery criteria = cb.createQuery();
            Root<Item> i = criteria.from(Item.class);
            Subquery<Bid> sq = criteria.subquery(Bid.class);
            Root<Bid> b = sq.from(Bid.class);
            sq.select(b).where(cb.equal(b.get("item"), i));
            criteria.select(i);
            criteria.where(cb.exists(sq));
            Query q = em.createQuery(criteria);
            List<Item> result = q.getResultList();
            assertEquals(result.size(), 2);
        }
        em.clear();
        {
            // Quantify ALL
            CriteriaQuery criteria = cb.createQuery();
            Root<Item> i = criteria.from(Item.class);
            Subquery<BigDecimal> sq = criteria.subquery(BigDecimal.class);
            Root<Bid> b = sq.from(Bid.class);
            sq.select(b.<BigDecimal>get("amount"));
            sq.where(cb.equal(b.get("item"), i));
            criteria.select(i);
            criteria.where(cb.greaterThanOrEqualTo(cb.literal(new BigDecimal(10)), cb.all(sq)));
            Query q = em.createQuery(criteria);
            List<Item> result = q.getResultList();
            assertEquals(result.size(), 2);
        }
        em.clear();
        {
            // Quantify ANY
            CriteriaQuery criteria = cb.createQuery();
            Root<Item> i = criteria.from(Item.class);
            Subquery<BigDecimal> sq = criteria.subquery(BigDecimal.class);
            Root<Bid> b = sq.from(Bid.class);
            sq.select(b.<BigDecimal>get("amount"));
            sq.where(cb.equal(b.get("item"), i));
            criteria.select(i);
            criteria.where(cb.equal(cb.literal(new BigDecimal("101.00")), cb.any(sq)));
            Query q = em.createQuery(criteria);
            List<Item> result = q.getResultList();
            assertEquals(result.size(), 1);
        }
        em.clear();
        tx.commit();
        em.close();
    } finally {
        TM.rollback();
    }
}
Also used : CriteriaBuilder(javax.persistence.criteria.CriteriaBuilder) UserTransaction(javax.transaction.UserTransaction) User(org.jpwh.model.querying.User) Root(javax.persistence.criteria.Root) CriteriaQuery(javax.persistence.criteria.CriteriaQuery) Query(javax.persistence.Query) CriteriaQuery(javax.persistence.criteria.CriteriaQuery) Subquery(javax.persistence.criteria.Subquery) BigDecimal(java.math.BigDecimal) Item(org.jpwh.model.querying.Item) EntityManager(javax.persistence.EntityManager) List(java.util.List) Bid(org.jpwh.model.querying.Bid) Test(org.testng.annotations.Test) QueryingTest(org.jpwh.test.querying.QueryingTest)

Aggregations

EntityManager (javax.persistence.EntityManager)11 UserTransaction (javax.transaction.UserTransaction)11 Bid (org.jpwh.model.querying.Bid)11 Item (org.jpwh.model.querying.Item)11 List (java.util.List)10 QueryingTest (org.jpwh.test.querying.QueryingTest)10 Test (org.testng.annotations.Test)10 User (org.jpwh.model.querying.User)9 BigDecimal (java.math.BigDecimal)8 Query (javax.persistence.Query)7 Set (java.util.Set)5 CriteriaBuilder (javax.persistence.criteria.CriteriaBuilder)5 CriteriaQuery (javax.persistence.criteria.CriteriaQuery)5 Root (javax.persistence.criteria.Root)5 Address (org.jpwh.model.querying.Address)4 LinkedHashSet (java.util.LinkedHashSet)3 Session (org.hibernate.Session)3 LogRecord (org.jpwh.model.querying.LogRecord)3 ArrayList (java.util.ArrayList)2 Date (java.util.Date)2