2016-11-04 47 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 –