In the previous post we saw some common HQL functions. I decided to explore them some more.
JPA provides support for performing arithmetic operations in the query. Consider the below code:
The logs indicate the same:
The logs indicate the query
BIT_LENGTH()
JPA provides support for performing arithmetic operations in the query. Consider the below code:
final Session session = sessionFactory.openSession(); //abs() Query q = session.createQuery("from Entity e where e.id = abs(-2)"); Entity entity = (Entity) q.uniqueResult(); System.out.println("Entity is " + entity); //sqrt() q = session.createQuery("from Entity e where e.id = sqrt(9)"); entity = (Entity) q.uniqueResult(); System.out.println("Entity is " + entity); //mod() q = session.createQuery("from Entity e where e.id = mod(16,14)"); entity = (Entity) q.uniqueResult(); System.out.println("Entity is " + entity);All the above queries include some arithmetic based functions. The generated SQL uses the equivalent functions provided by the underlying database, in my case MySQL.
The logs indicate the same:
3421 [main] DEBUG org.hibernate.SQL - /* from Entity e where e.id = abs(-2) */
select entity0_.ID as ID0_, entity0_.NAME as NAME0_, entity0_.DATE as DATE0_, entity0_.MASTER_ID as MASTER4_0_ from ENTITY entity0_ where entity0_.ID=abs(-2) Entity is [Entity] : ( id 2 , data : entity2 , master.Id : 1 , date : null )] ... 3609 [main] DEBUG org.hibernate.SQL - /* from Entity e where e.id = sqrt(9) */
select entity0_.ID as ID0_, entity0_.NAME as NAME0_, entity0_.DATE as DATE0_, entity0_.MASTER_ID as MASTER4_0_ from ENTITY entity0_ where entity0_.ID=sqrt(9) Entity is [Entity] : ( id 3 , data : entity3 , master.Id : 1 , date : null )] ... 3656 [main] DEBUG org.hibernate.SQL - /* from Entity e where e.id = mod(16,14) */
select entity0_.ID as ID0_, entity0_.NAME as NAME0_, entity0_.DATE as DATE0_, entity0_.MASTER_ID as MASTER4_0_ from ENTITY entity0_ where entity0_.ID=mod(16, 14) Entity is [Entity] : ( id 2 , data : entity2 , master.Id : 1 , date : null )]locate function():
final Session session = sessionFactory.openSession(); //searches for occurrence of 2 at 7 location. e.g. entity2 Query q = session.createQuery("from Entity e where locate('2', e.name, 1) = 7"); Entity entity = (Entity) q.uniqueResult(); System.out.println("Entity is " + entity);The method is string operation related. It returns the position of the first occurrence of a string('2') within a string( the name column). A third optional argument may be used to specify from which position of the search string searching will start. If this position is not mentioned, searching starts from the beginning.
The logs indicate the query
2797 [main] DEBUG org.hibernate.SQL - /* from Entity e where locate('2', e.name, 1) = 7 */ select entity0_.ID as ID0_, entity0_.NAME as NAME0_, entity0_.DATE as DATE0_, entity0_.MASTER_ID as MASTER4_0_ from ENTITY entity0_ where locate('2', entity0_.NAME, 1)=7 Entity is [Entity] : ( id 2 , data : entity2 , master.Id : 1 , date : null )]Hibernate additionally provides functions that are not a part of JPA(JQL) and can be used in our HQL queries. I tested some of them.
BIT_LENGTH()
final Session session = sessionFactory.openSession(); Query q = session.createQuery("select bit_length(e.name) from Entity e where e.id = 2"); Long bitLength = (Long) q.uniqueResult(); System.out.println("Number of bits is " + bitLength);The function returns the number of bits. The logs indicate the generated query.
2797 [main] DEBUG org.hibernate.SQL - /* select bit_length(e.name) from Entity e where e.id = 2 */ select bit_length(entity0_.NAME) as col_0_0_ from ENTITY entity0_ where entity0_.ID=2 Number of bits is 56HQL also includes data-time related functions. I created a mash-up of all such functions in the below code:
public static void testHqlDbTemporalFn() { final Session session = sessionFactory.openSession(); System.out.println("The current time is " + new Date()); Query q1 = session.createQuery("from Entity as e where e.date > current_date()");//only date Entity entity = (Entity) q1.list().get(0); System.out.println("current_date Entity0 : " + entity); Query q2 = session.createQuery("from Entity as e where e.date > current_time()");//gets only time entity = (Entity) q2.list().get(0); System.out.println("current_time Entity0 : " + entity); Query q3 = session.createQuery("from Entity as e where e.date < current_timestamp()");//date and time entity = (Entity) q3.list().get(0); System.out.println("current_timestamp Entity0 : " + entity); Query q4 = session.createQuery("select SECOND(e.date), " + "MINUTE(e.date), HOUR(e.date), DAY(e.date), MONTH(e.date), YEAR(e.date) " + "from Entity e where e.id = 3"); List<Object[]> result = q4.list(); for (Object[] rec : result) { System.out.println("SECOND(e.date) " + rec[0]); System.out.println("MINUTE(e.date) " + rec[1]); System.out.println("HOUR(e.date) " + rec[2]); System.out.println("DAY(e.date) " + rec[3]); System.out.println("MONTH(e.date) " + rec[4]); System.out.println("YEAR(e.date) " + rec[5]); } }The output is as below:
The current time is Sun Jul 01 17:45:39 IST 2012 Hibernate: /* from Entity as e where e.date > current_date() */ select entity0_.ID as ID0_, entity0_.NAME as NAME0_, entity0_.DATE as DATE0_, entity0_.MASTER_ID as MASTER4_0_ from ENTITY entity0_ where entity0_.DATE>current_date current_date Entity0 : [Entity] : ( id 2 , data : entity2 , master.Id : 1 , dat e : 2012-10-10 12:20:20.0 )] Hibernate: /* from Entity as e where e.date > current_time() */ select entity0_.ID as ID0_, entity0_.NAME as NAME0_, entity0_.DATE as DATE0_, entity0_.MASTER_ID as MASTER4_0_ from ENTITY entity0_ where entity0_.DATE>current_time current_time Entity0 : [Entity] : ( id 1 , data : newOne , master.Id : 1 , date : 2010-07-04 16:16:43.0 )] Hibernate: /* from Entity as e where e.date < current_timestamp() */ select entity0_.ID as ID0_, entity0_.NAME as NAME0_, entity0_.DATE as DATE0_, entity0_.MASTER_ID as MASTER4_0_ from ENTITY entity0_ where entity0_.DATE<current_timestamp current_timestamp Entity0 : [Entity] : ( id 1 , data : newOne , master.Id : 1 , date : 2010-07-04 16:16:43.0 )] Hibernate: /* select SECOND(e.date), MINUTE(e.date), HOUR(e.date), DAY(e.date), MONTH(e.date), YEAR(e.date) from Entity e where e.id = 3 */ select second(entity0_.DATE) as col_0_0_, minute(entity0_.DATE) as col_1_0_, hour(entity0_.DATE) as col_2_0_, day(entity0_.DATE) as col_3_0_, month(entity0_.DATE) as col_4_0_, year(entity0_.DATE) as col_5_0_ from ENTITY entity0_ where entity0_.ID=3 SECOND(e.date) 20 MINUTE(e.date) 20 HOUR(e.date) 15 DAY(e.date) 10 MONTH(e.date) 10 YEAR(e.date) 2011As seen these functions can be used in the where clause and the select clause.
No comments:
Post a Comment