在 HQL 中使用 new 抛出异常?
Throw exception using new into HQL?
我正在尝试使用 new
到 select 实体的某些值来创建 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();
}
}
我终于解决了这个问题。我只定义属性 totalEntradas
和 totalSaidas
到 Int64
及其作品。
我正在尝试使用 new
到 select 实体的某些值来创建 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();
}
}
我终于解决了这个问题。我只定义属性 totalEntradas
和 totalSaidas
到 Int64
及其作品。