2016-11-04 51 views
2

我想在我的HQL查詢使用自定義功能,我在數據庫中註冊的功能,這是我的函數的SQL代碼:如何使用Hibernate寄存器功能在HQL查詢

BEGIN 
DECLARE user_id_var VARCHAR(64); 
    SELECT 
    e.username 
FROM 
    users e where e.id=30 INTO user_id_var; 
    return user_id_var; 
END 

並註冊一類爲MysqlCustomDilect:

public class MysqlCustomDilect extends MySQLDialect{ 

    public MysqlCustomDilect() { 
     super(); 
     registerFunction("getActiveUser", new StandardSQLFunction("getActiveUser")); 
} 

} 

,並用這條線把它添加到hibernate.cfg.xml文件:

<property name="hibernate.dialect" value="myProject.common.MysqlCustomDilect" /> 

並調用它像這樣的代碼在我DAO層:

@Override 
    public List<Entity> getAll() { 
     Session session = getSession(); 
     String hql = " select e.id as id,function('getActiveUser') as name from " + domainClass.getName() + " e "; 
     Query query=session.createQuery(hql); 
     return query.list(); 

    } 

但Hibernate不知道它,提出這個錯誤:

unexpected token: function near line 1, column 18 [ from e.id as id,function('getActiveUser') ........ 
+0

這是歪曲,我修復它,但它不是那個 –

回答

1

JPA支持主叫用戶定義函數是這樣的:

select i 
from Item i 
where function('substring', i.name, 1, 3) = 'abc'") 

首先,你的功能不完整,你只粘貼正文,而不是功能名稱。

其次,你是串聯字符串,所以你冒着SQL注入攻擊的風險。

三,HQL是畸形:

從e.id

你怎麼會從一個標識符選擇? FROM子句應該是列出一個實體。

因此,HQL是最有可能的:

select e, function('getActiveUser',) as name 
from MyEntity e 

爲什麼您連接的domainClass.getName()?如果實體查詢是動態的,則使用Criteria API。

+0

hql在不正確的抱歉,因爲我修復它,檢查我更新的問題,和domainClass.getName()是動態的,並返回類名稱 –

+1

也許你正在使用舊版本的Hibernate。 –

+0

我用戶4.3.10.Final –