cloudfier icon indicating copy to clipboard operation
cloudfier copied to clipboard

query generation must deal with operation and local var references in query criteria

Open abstratt opened this issue 9 years ago • 1 comments

java.lang.IllegalArgumentException: org.hibernate.QueryException: Not all named parameters have been set: [systemUser] [SELECT DISTINCT tarefa_ FROM Tarefa tarefa_ WHERE tarefa_.responsavel = :systemUser AND tarefa_.estado = 'EmAberto']

    static query minhasEmAberto() : Tarefa[*];
    begin
        return Tarefa extent.select((t : Tarefa) : Boolean {
            t.responsavel == System#user() and t.estado == Estado#EmAberto
        });
    end;
    public Collection<Tarefa> minhasEmAberto() {
        return getEntityManager().createQuery(
            "SELECT DISTINCT tarefa_ FROM Tarefa tarefa_ WHERE tarefa_.responsavel = :systemUser AND tarefa_.estado = 'EmAberto'", Tarefa.class
        ).getResultList();
    }

Changing it to:

    static query minhasEmAberto() : Tarefa[*];
    begin
        var currentUser;
        currentUser := System#user();
        return Tarefa extent.select((t : Tarefa) : Boolean {
            t.responsavel == currentUser and t.estado == Estado#EmAberto
        });
    end;

does not help, and causes another issue ("mdd_types.SystemUser cannot be resolved to a type"):

public Collection<Tarefa> minhasEmAberto() {
        mdd_types.SystemUser currentUser = getCurrentUser();
        return getEntityManager().createQuery(
            "SELECT DISTINCT tarefa_ FROM Tarefa tarefa_ WHERE tarefa_.responsavel = :currentUser AND tarefa_.estado = 'EmAberto'", Tarefa.class
        ).getResultList();
    }

abstratt avatar Jul 06 '16 13:07 abstratt

Workaround refactor the query to always take parameters for all non-DB data needs, and then create another query that just invokes it with the correct values.

abstratt avatar Jul 06 '16 13:07 abstratt