2016-11-04 2 views
2

ich eine benutzerdefinierte Funktion in meiner HQL Abfrage verwenden möchten, und ich eine Funktion in der Datenbank registrieren und das ist SQL-Code ist meine Funktion:Wie Hibernate Registerfunktion in HQL Abfrage verwenden

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 

und es registrieren mit einer Klasse als MysqlCustomDilect:

public class MysqlCustomDilect extends MySQLDialect{ 

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

} 

und fügen sie ihn mit dieser Zeile hibernate.cfg.xml Datei:

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

und es wie dieser Code in meiner dao Schicht nennen:

@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(); 

    } 

aber Hibernate es nicht weiß, und diese Fehler aus:

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

wurde misstyping, ich es beheben, aber es geht nicht darum, dass –

Antwort

1

JPA unterstützt wie diese benutzerdefinierte Funktionen aufrufen:

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

Zuerst ist Ihre Funktion nicht abgeschlossen, Sie haben nur den Körper eingefügt, aber nicht den Funktionsnamen.

Zweitens sind Sie Verkettungszeichenfolgen, so dass Sie SQL Injection-Angriffe riskieren.

Drittens ist die HQL malformed:

von e.id

Wie kommen Sie aus einem Bezeichner sind die Auswahl? Die FROM-Klausel sollte stattdessen eine Entität auflisten.

Daher ist die HQL höchstwahrscheinlich:

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

Warum verketten Sie die domainClass.getName()? Verwenden Sie die Kriterien-API, wenn die Entitätsabfrage dynamisch ist.

+0

die hql in falschen leid, dass ich es beheben, meine aktualisierte Frage prüfen, und domainClass.getName() ist dynamisch und zurück für mich die Klassennamen –

+1

Sie Vielleicht verwenden eine alte Version von Hibernate. –

+0

ich Benutzer 4.3.10.Final –

Verwandte Themen