package io.robe.hibernate.criteria.api.criteria; import io.robe.hibernate.criteria.api.Criteria; import io.robe.hibernate.criteria.api.Order; import io.robe.hibernate.criteria.HqlCriteriaTestTools; import io.robe.hibernate.criteria.api.criterion.Restriction; import io.robe.hibernate.criteria.api.criterion.Restrictions; import io.robe.hibernate.criteria.api.projection.Projections; import io.robe.hibernate.criteria.hql.TransformerImpl; import io.robe.hibernate.test.entity.Role; import io.robe.hibernate.test.entity.User; import org.hibernate.Session; import org.junit.*; import java.util.List; import java.util.Map; import static org.junit.Assert.*; /** * Created by kamilbukum on 16/01/2017. */ public class CriteriaTest extends HqlCriteriaTestTools { @Test public void createCriteria() throws Exception { Session session = sessionFactory.openSession(); Criteria<User> criteria = Criteria.createCriteria(User.class, new TransformerImpl<User>(session)); assertNotNull(criteria); } @Test public void setOffset() throws Exception { Session session = sessionFactory.openSession(); Criteria<User> criteria = Criteria.createCriteria( User.class, new TransformerImpl<User>(session)); criteria.setOffset(2); assertEquals(2, (long)criteria.getOffset()); } @Test public void setLimit() throws Exception { Session session = sessionFactory.openSession(); Criteria<User> criteria = Criteria.createCriteria(User.class, new TransformerImpl<User>(session)); criteria.setLimit(50); assertEquals(50, (long)criteria.getLimit()); } @Test public void getOffset() throws Exception { Session session = sessionFactory.openSession(); Criteria<User> criteria = Criteria.createCriteria(User.class, new TransformerImpl<User>(session)); criteria.setOffset(2); assertEquals(2, (long)criteria.getOffset()); } @Test public void getLimit() throws Exception { Session session = sessionFactory.openSession(); Criteria<User> criteria = Criteria.createCriteria(User.class, new TransformerImpl<User>(session)); criteria.setLimit(50); assertEquals(50, (long)criteria.getLimit()); } @Test public void list() throws Exception { Session session = sessionFactory.openSession(); // list without any parameter Criteria<User> criteria = Criteria.createCriteria(User.class, new TransformerImpl<User>(session)); List<User> userList = criteria.list(); List<User> expectedList = session.createQuery("SELECT user FROM io.robe.hibernate.test.entity.User user").list(); assertEquals(expectedList, userList); // list by limit ( maxresults ) criteria = Criteria.createCriteria(User.class, new TransformerImpl<User>(session)).setLimit(2); userList = criteria.list(); expectedList = session.createQuery("SELECT user FROM io.robe.hibernate.test.entity.User user").setMaxResults(2).list(); assertEquals(expectedList, userList); // list by offset and limit criteria = Criteria.createCriteria(User.class, new TransformerImpl<User>(session)).setOffset(2).setLimit(2); userList = criteria.list(); expectedList = session.createQuery("SELECT user FROM io.robe.hibernate.test.entity.User user").setFirstResult(2).setMaxResults(2).list(); assertEquals(expectedList, userList); criteria = Criteria.createCriteria(User.class, new TransformerImpl<User>(session)) .add(Restrictions.gt("failCount", 6)); userList = criteria.list(); System.out.println(userList); } @Test public void mapTest(){ Session session = sessionFactory.openSession(); // list by offset and limit Criteria<Map<String, Object>> mapCriteria = Criteria .createCriteria(User.class, new TransformerImpl<>(session, Criteria.MAP_CLASS)) .setProjection(Projections.projectionList().add( Projections.alias( Projections.max("failCount"), "max_failCount"), "name" )).addOrder(Order.ascByAlias("max_failCount")); mapCriteria .createJoin(Role.class, "roleOid") .setProjection(Projections.alias( Projections.property("name"), "role.name" )); List<Map<String, Object>> mapList = mapCriteria.list(); System.out.println(mapList); } @Test public void pairList() throws Exception { } @Test public void count() throws Exception { Session session = sessionFactory.openSession(); // simple count Criteria<User> criteria = Criteria.createCriteria(User.class, new TransformerImpl<User>(session)); long result = criteria.count(); long expectedResult = (long)session.createQuery("SELECT count(user) FROM io.robe.hibernate.test.entity.User user").uniqueResult(); assertEquals(result, expectedResult); // count with restriction criteria = Criteria.createCriteria(User.class, new TransformerImpl<User>(session)).add(Restrictions.eq("name", "Kamil")); result = criteria.count(); expectedResult = (long)session.createQuery("" + "SELECT count(user) FROM io.robe.hibernate.test.entity.User user " + "WHERE user.name = :name" ).setParameter("name", "Kamil").uniqueResult(); assertEquals(expectedResult, result); // count with join criteria = Criteria.createCriteria(User.class, new TransformerImpl<User>(session)).add(Restrictions.eq("name", "Kamil")); criteria.createJoin(Role.class).addRelation("oid", "roleOid"); result = criteria.count(); expectedResult = (long)session.createQuery("" + "SELECT count(user) FROM io.robe.hibernate.test.entity.User user " + "WHERE user.name = :name" ).setParameter("name", "Kamil").uniqueResult(); assertEquals(expectedResult, result); criteria = Criteria.createCriteria(User.class, new TransformerImpl<User>(session)).add( Restrictions.eq("name", "Kamil")); criteria. createJoin(Role.class).addRelation("oid", "roleOid") .add(Restrictions.eq("name", "Example First Role")); result = criteria.count(); expectedResult = (long)session.createQuery("" + "SELECT count(*) FROM \n" + "io.robe.hibernate.test.entity.User user \n" + "LEFT OUTER JOIN io.robe.hibernate.test.entity.Role role ON \n" + "user.roleOid=role.oid AND role.name=:role_name\n" + "WHERE user.name=:user_name" ).setParameter("user_name", "Kamil").setParameter("role_name", "Example First Role").uniqueResult(); assertEquals(expectedResult, result); criteria = Criteria.createCriteria(User.class, new TransformerImpl<User>(session)).add( Restrictions.eq("name", "Kamil")); criteria.createJoin(Role.class).addRelation("oid", "roleOid").add(Restrictions.eq("name", "Example First Role")); result = criteria.count(); expectedResult = (long)session.createQuery("" + "SELECT count(*) AS DCOUN FROM \n" + "io.robe.hibernate.test.entity.User user \n" + "LEFT OUTER JOIN io.robe.hibernate.test.entity.Role role ON \n" + "user.roleOid=role.oid AND role.name=:role_name\n" + "WHERE user.name=:user_name" ).setParameter("user_name", "Kamil").setParameter("role_name", "Example First Role").uniqueResult(); assertEquals(expectedResult, result); criteria = Criteria .createCriteria(User.class, new TransformerImpl<User>(session)) .add( Restrictions.or( Restrictions.eq("name", "Kamil"), Restrictions.eq("name", "Seray") ) ); criteria .createJoin(Role.class) .addRelation("oid", "roleOid") .add(Restrictions.eq("name", "Example First Role")); result = criteria.count(); expectedResult = (long)session.createQuery("" + "SELECT count(*) FROM \n" + "io.robe.hibernate.test.entity.User user \n" + "LEFT OUTER JOIN io.robe.hibernate.test.entity.Role role ON \n" + "user.roleOid=role.oid AND role.name=:role_name\n" + "WHERE user.name=:name1 OR user.name=:name2" ).setParameter("name1", "Kamil").setParameter("name2", "Seray").setParameter("role_name", "Example First Role").uniqueResult(); assertEquals(expectedResult, result); criteria = Criteria .createCriteria(User.class, new TransformerImpl<User>(session)) .add( Restrictions.and( Restrictions.or( Restrictions.eq("name", "Kamil"), Restrictions.eq("name", "Seray") ), Restrictions.eq("active", false) ) ); criteria .createJoin(Role.class) .addRelation("oid", "roleOid") .add(Restrictions.eq("name", "Example First Role")); result = criteria.count(); expectedResult = (long)session.createQuery("" + "SELECT count(*) FROM \n" + "io.robe.hibernate.test.entity.User user \n" + "LEFT OUTER JOIN io.robe.hibernate.test.entity.Role role ON \n" + "user.roleOid=role.oid AND role.name=:role_name\n" + "WHERE (user.name=:name1 OR user.name=:name2) AND user.active=:activeAlias" ).setParameter("name1", "Kamil").setParameter("name2", "Seray").setParameter("activeAlias", false).setParameter("role_name", "Example First Role").uniqueResult(); assertEquals(expectedResult, result); } @Test public void uniqueResult() throws Exception { Session session = sessionFactory.openSession(); // simple count Criteria<User> criteria = Criteria .createCriteria(User.class, new TransformerImpl<User>(session)) .add( Restrictions.and( Restrictions.or( Restrictions.eq("name", "Kamil"), Restrictions.eq("name", "Seray") ), Restrictions.eq("active", false) ) ); criteria .createJoin(Role.class) .addRelation("oid", "roleOid") .add(Restrictions.eq("name", "Example First Role")); User user = (User) criteria.uniqueResult(); User expectedResult = (User) session.createQuery("" + "SELECT user FROM \n" + "io.robe.hibernate.test.entity.User user \n" + "LEFT OUTER JOIN io.robe.hibernate.test.entity.Role role ON \n" + "user.roleOid=role.oid AND role.name=:role_name\n" + "WHERE (user.name=:name1 OR user.name=:name2) AND user.active=:activeAlias" ).setParameter("name1", "Kamil").setParameter("name2", "Seray").setParameter("activeAlias", false).setParameter("role_name", "Example First Role").uniqueResult(); assertEquals(expectedResult, expectedResult); } @Test public void getTransformer() throws Exception { Session session = sessionFactory.openSession(); Criteria<User> criteria = Criteria .createCriteria(User.class, new TransformerImpl<User>(session)); assertNotNull(criteria.getTransformer()); } @Test public void getOrders() throws Exception { Session session = sessionFactory.openSession(); List<User> expectedResult = session.createQuery("SELECT user\n" + "FROM io.robe.hibernate.test.entity.User user ORDER BY user.name ASC,user.active DESC").list(); Criteria<User> criteria = Criteria .createCriteria(User.class, new TransformerImpl<User>(session)).addOrder(Order.asc("name")).addOrder(Order.desc("active")); List<User> users = criteria.list(); assertEquals(expectedResult, users); expectedResult = session.createQuery("SELECT user\n" + "FROM io.robe.hibernate.test.entity.User user ORDER BY user.name ASC,user.active DESC").list(); criteria = Criteria .createCriteria(User.class, new TransformerImpl<User>(session)) .addOrder(Order.asc("name")) .addOrder(Order.desc("active")); criteria.createJoin(Role.class, "roleOid").addOrder(Order.asc("name")); users = criteria.list(); System.out.println(expectedResult); assertEquals(expectedResult, users); } }