本文為部落客原創文章,轉載請獲得原作者同意并注明來源:http://blog.csdn.net/wengminyu/article/details/78675529
項目中用到了Hibernate架構,在此記錄下HQL常用函數,以備查閱,也供他人參考。
CONCAT
字元串連接配接函數。此函數接受兩個或以上的參數。
List<String> callHistory = entityManager.createQuery(
"select concat( p.number, ' : ' , cast(c.duration as string) ) " +
"from Call c " +
"join c.phone p", String.class )
.getResultList();
SUBSTRING
字元串子串函數。第二個參數代表截取子串的起始位置,從1開始。第三個參數(可選)代表子串的長度。
List<String> prefixes = entityManager.createQuery(
"select substring( p.number, 1, 2 ) " +
"from Call c " +
"join c.phone p", String.class )
.getResultList();
UPPER, LOWER
将給定字元串中所有字母轉換為大寫或小寫。不多解釋。
TRIM
和SQL中的TRIM函數一樣,删除兩端多餘空格。
List<String> names = entityManager.createQuery(
"select trim( p.name ) " +
"from Person p ", String.class )
.getResultList();
LENGTH
傳回給定字元串的長度。
LOCATE
傳回給定子串(第一個參數)在字元串(第二個參數)中首次出現的位置。第三個參數(可選)代表開始搜尋的位置。
List<Integer> sizes = entityManager.createQuery(
"select locate( 'John', p.name ) " +
"from Person p ", Integer.class )
.getResultList();
ABS, MOD, SQRT
分别傳回絕對值,取模,算數平方根。
CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP
分别傳回資料庫的目前日期,時間,時間戳。
BIT_LENGTH
傳回二進制資料的長度。
List<Number> bits = entityManager.createQuery(
"select bit_length( c.duration ) " +
"from Call c ", Number.class )
.getResultList();
CAST
執行SQL的CAST函數。目标必須被轉換為Hibernate的資料類型,而不是資料庫中的類型。Hibernate的所有資料類型詳見:data types
List<String> durations = entityManager.createQuery(
"select cast( c.duration as string ) " +
"from Call c ", String.class )
.getResultList();
EXTRACT
執行SQL的EXTRACT函數,将datetime中的一部分(例如年份)提取出來。
List<Integer> years = entityManager.createQuery(
"select extract( YEAR from c.timestamp ) " +
"from Call c ", Integer.class )
.getResultList();
此函數有以下幾個縮略版。
YEAR, MONTH, DAY, HOUR, MINUTE, SECOND
分别傳回datetime中的年份、月份、日子、小時、分鐘、秒。
List<Integer> years = entityManager.createQuery(
"select year( c.timestamp ) " +
"from Call c ", Integer.class )
.getResultList();
STR
将給定的時間或數值類型轉換為字元資料。是CAST的縮略版。
List<String> timestamps = entityManager.createQuery(
"select str( c.timestamp ) " +
"from Call c ", String.class )
.getResultList();
List<String> timestamps = entityManager.createQuery(
"select str( cast(duration as float) / 60, 4, 2 ) " +
"from Call c ", String.class )
.getResultList();
||
和SQL一樣,Hibernate還提供了||操作符用于字元串拼接。不過由于JPQL(Java Persistence Query Language)中沒有定義這個操作符,是以盡量避免使用。
String name = entityManager.createQuery(
"select 'Customer ' || p.name " +
"from Person p " +
"where p.id = ", String.class )
.getSingleResult();
TYPE
TYPE函數可以用來擷取實體的類型。當實體類有繼承層次時,這個函數非常有用。此外,實體類别還可以被參數化。
List<Payment> payments = entityManager.createQuery(
"select p " +
"from Payment p " +
"where type(p) = CreditCardPayment", Payment.class )
.getResultList();
List<Payment> payments = entityManager.createQuery(
"select p " +
"from Payment p " +
"where type(p) = :type", Payment.class )
.setParameter( "type", WireTransferPayment.class)
.getResultList();
參考資料:Hibernate API
如果在本文中沒有找到想要的資訊,可以到上面的連結裡進一步查找。