天天看點

HQL常用函數

本文為部落客原創文章,轉載請獲得原作者同意并注明來源: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

如果在本文中沒有找到想要的資訊,可以到上面的連結裡進一步查找。

繼續閱讀