I need to execute a query to fetch all entities with id is greater than 5 and the names start with "ent". That means there are two distinct conditions. Doing that using HQL would be pretty straightforward:
But what if need an OR condition ?
What if we need to add an additional and clause to the above or clauses. That is I need all entities whose id is greater than 5 or the names start with "ent" . But the master for all records must have id equal to 1.
public static void testTwoConditions() { final Session session = sessionFactory.openSession(); Query q = session.createQuery("from Entity e where e.id > 3 " + "and e.name like 'ent%'"); List<Entity> entities = q.list(); System.out.println(entities); }Doing the same in Criteria means applying two criterions on the same criteria instance.
public static void testTwoConditions() { final Session session = sessionFactory.openSession(); Criteria criteria = session.createCriteria(Entity.class); criteria.add(Restrictions.gt("id",3)); criteria.add(Restrictions.like("name", "ent",MatchMode.START)); List<Entity> entities = criteria.list(); System.out.println(entities); }The query is :
select this_.ID as ID0_0_, this_.NAME as NAME0_0_, this_.DATE as DATE0_0_, this_.MASTER_ID as MASTER4_0_0_ from ENTITY this_ where this_.ID>? and this_.NAME like ?As can be seen applying two conditions together is as simple as adding two criterions. Every addition of a Criterion instance will result in an additional and condition being applied to the where clause of the SQL query.
But what if need an OR condition ?
public static void testTwoOrConditions() { final Session session = sessionFactory.openSession(); Criteria criteria = session.createCriteria(Entity.class); criteria.add(Restrictions.or(Restrictions.gt("id",3), Restrictions.like("name", "ent",MatchMode.START))); List<Entity> entities = criteria.list(); System.out.println(entities); }The query will be:
select this_.ID as ID0_0_, this_.NAME as NAME0_0_, this_.DATE as DATE0_0_, this_.MASTER_ID as MASTER4_0_0_ from ENTITY this_ where ( this_.ID>? or this_.NAME like ? )The other way to do the same would be using the Restrictions.disjunction() method:
public static void testDisjunction() { final Session session = sessionFactory.openSession(); Criteria criteria = session.createCriteria(Entity.class); criteria.add( Restrictions.disjunction() .add(Restrictions.gt("id",3)) .add(Restrictions.like("name", "ent",MatchMode.START) ) ); List<Entity> entities = criteria.list(); System.out.println(entities); }This will also generate an identical query.
What if we need to add an additional and clause to the above or clauses. That is I need all entities whose id is greater than 5 or the names start with "ent" . But the master for all records must have id equal to 1.
public static void testDisjunctionWithConjuction() { final Session session = sessionFactory.openSession(); Criteria criteria = session.createCriteria(Entity.class); criteria.add( Restrictions.disjunction() .add(Restrictions.gt("id", 3)) .add(Restrictions.like("name", "ent", MatchMode.START)) ) .add(Restrictions.eq("master.id", 1l) ); List<Entity> entities = criteria.list(); System.out.println(entities); }The query generated is:
select this_.ID as ID0_0_, this_.NAME as NAME0_0_, this_.DATE as DATE0_0_, this_.MASTER_ID as MASTER4_0_0_ from ENTITY this_ where ( this_.ID>? or this_.NAME like ? ) and this_.MASTER_ID=?The same result will be produced with the below method:
public static void testOrFollowedByAnd() { final Session session = sessionFactory.openSession(); Criteria criteria = session.createCriteria(Entity.class); criteria.add( Restrictions.or( Restrictions.gt("id",3), Restrictions.like("name", "ent",MatchMode.START) )) .add( Restrictions.eq("master.id",1l) ); List<Entity> entities = criteria.list(); System.out.println(entities); }I decided to tweak the query a little - I need all entities whose id is greater than 5 and the names start with "ent" . Or the master must have id equal to 1. The Criteria query now is :
public static void testAndFollowedByOr() { final Session session = sessionFactory.openSession(); Criteria criteria = session.createCriteria(Entity.class); criteria.add( Restrictions.or( Restrictions.and( Restrictions.gt("id",3), Restrictions.like("name", "ent",MatchMode.START) ) ,Restrictions.eq("master.id",1l) ) ); List<Entity> entities = criteria.list(); System.out.println(entities); }The query generated is :
select this_.ID as ID0_0_, this_.NAME as NAME0_0_, this_.DATE as DATE0_0_, this_.MASTER_ID as MASTER4_0_0_ from ENTITY this_ where ( ( this_.ID>? and this_.NAME like ? ) or this_.MASTER_ID=? ) [[Entity] : ( id 2 , data : entity1 , master.Id : 1 , date : null )], [Entity] : ( id 3 , data : entity2 , master.Id : 1 , date : null )], [Entity] : ( id 4 , d ata : entity100 , master.Id : 2 , date : null )], [Entity] : ( id 5 , data : ent ity102 , master.Id : 2 , date : null )]]
No comments:
Post a Comment