在HQL中使用new抛出异常?

时间:2016-10-07 03:46:16

标签: c# nhibernate hql

我正在尝试使用new创建一个使用HQL的查询来选择实体的某些值,它可以在不使用SUM的情况下工作,但我需要SUM此实体的某些值。为此,我在这个实体中创建了一个构造函数来接收这个hql查询的参数,如果我传递的参数没有SUM它可以工作,但是传递SUM作为参数没有。我该怎么解决这个问题?

例外是

An unhandled exception of type 'NHibernate.QueryException' occurred in NHibernate.dll

Additional information: Unable to locate appropriate constructor on class [ControleDeVendas.domain.Estoque, ControleDeVendas, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]

尝试

public IList<Estoque> findByDateSintetico(DateTime di, DateTime df){            
            ISession _session = getSession();
            String SQL = "SELECT new Estoque(e.dtTransacao, e.produto, e.tipoOperacao, e.qtdTransacao, " + 
                                            "SUM(CASE e.tipoOperacao WHEN 'E' THEN e.qtdTransacao ELSE 0 END), " + 
                                            "SUM(CASE e.tipoOperacao WHEN 'S' THEN e.qtdTransacao ELSE 0 END) " +
                                            ")" +
                         "FROM Estoque e " +
                         "WHERE e.dtTransacao BETWEEN :di AND :df " +
                         "GROUP BY e.dtTransacao, e.produto " +
                         "ORDER BY e.dtTransacao";
            IList<Estoque> list = _session.CreateQuery(SQL)
                .SetParameter("di", di)
                .SetParameter("df", df)
                .List<Estoque>();
            Console.WriteLine("LISTA ESTOQUE: " + list.Count);
            return list;
        }

实体

[Serializable]
    public class Estoque {

        public virtual long id                              { set; get; }
        public virtual DateTime dtTransacao                 { set; get; }
        public virtual Produto produto                      { set; get; }
        public virtual String historico                     { set; get; }
        public virtual String tipoOperacao                  { set; get; }
        public virtual int qtdTransacao                     { set; get; }
        public virtual decimal valorTransacao               { set; get; }
        public virtual String usuario                       { set; get; }
        public virtual int totalEntradas                    { set; get; }
        public virtual int totalSaidas                      { set; get; }

        public Estoque() {            
        }

        //receive params of HQL Query
        public Estoque(DateTime dtTransacao, Produto produto, String tipoOperacao, int qtdTransacao, int totalEntradas, int totalSaidas){
            this.dtTransacao = dtTransacao;
            this.produto = produto;
            this.tipoOperacao = tipoOperacao;
            this.qtdTransacao = qtdTransacao;
            this.totalEntradas = totalEntradas;
            this.totalSaidas = totalSaidas;
        }

        public override bool Equals(object obj){
            return base.Equals(obj);
        }

        public override int GetHashCode(){
            return base.GetHashCode();
        }
    }

1 个答案:

答案 0 :(得分:0)

我终于解决了这个问题。我只将属性totalEntradastotalSaidas定义为Int64及其作品。