当我尝试执行此HQL以返回对象时,出现Ponto此错误:
Ponto
错误[org.hibernate.hql.PARSER](http- localhost-127.0.0.1-8080-2)无法在类[br.com.cdv.model.entity.Ponto]上找到适当的构造函数[原因= org.hibernate。 PropertyNotFoundException:类中没有适当的构造函数:br.com.cdv.model.entity.Ponto]
道
@SuppressWarnings("unchecked") @Override public List<Ponto> listLoja(Integer idLoja) { Query q = getSession().createQuery("select new Ponto(0,ss.cliente,ss.loja,null,null,null,null,null,sum(qtdPontos),'',0) " + "from Ponto as ss where ss.loja.id = :idLoja " + "group by ss.cliente, ss.loja"); q.setParameter("idLoja", idLoja); return (List<Ponto>) q.list(); }
我的实体/类
@Entity @Table (name = "ponto") public class Ponto implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue private Integer id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="cliente", nullable=true) private UsuarioCliente cliente; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="loja", nullable=false) private UsuarioLoja loja; @Column(name="dataCriacao") private Date dataCriacao; @Column(name="dataUtilizado", length=12, nullable=true) private Date dataUtilizado; @Column(name="dataExpira") private Date dataExpira; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "funcionario", nullable=true) private Funcionario funcionario; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "pontoReceber", nullable=true) private PontoReceber pontoReceber; @Column(name="qtdPontos", nullable=false) private long qtdPontos; @Column(name="obsPontos", nullable = true,length=300) private String obsPontos; @NotEmpty @Column(name="tipo",nullable = false) private Integer tipo; public Ponto(Integer id, UsuarioCliente cliente,UsuarioLoja loja, Date dataCriacao, Date dataUtilizado, Date dataExpira, Funcionario funcionario, PontoReceber pontoReceber, long qtdPontos, String obsPontos, Integer tipo) { setId(id); setCliente(cliente); setLoja(loja); setDataCriacao(dataCriacao); setDataUtilizado(dataUtilizado); setDataExpira(dataExpira); setFuncionario(funcionario); setPontoReceber(pontoReceber); setQtdPontos(qtdPontos); setObsPontos(obsPontos); setTipo(tipo); } // getters and setters }
控制:
@RequestMapping("/listarClientes") public String listarClientesPontos(Map<String, Object> map, HttpSession session) { ... List<Ponto> pontos = pontoService.listLoja(loja.getId()); map.put("pontos", pontos); return "listaClientesPonto"; } }
视图:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%> <%@taglib uri="http://www.springframework.org/tags" prefix="spring"%> <body> <h2>Lista Clientes</h2> <table> <tr> <th>ID Cliente</th> <th>CPF Cliente</th> <th>Pontos totais:</th> </tr> <c:forEach items="${pontos}" var="ponto" varStatus="count"> <tr> <td>${ponto.cliente.id}</td> <td>${ponto.cliente.cpf}</td> <td>${ponto.qtdPontos}</td> </tr> </c:forEach> </table> </body>
为什么我收到此错误? 有什么更好的理由为什么要在列表中接收此对象Ponto?
obs ..不new Ponto(...)返回带有未知对象的Ponto列表[]
new Ponto(...)
发现了问题…我做了一些不好的构造函数,所以我在实体中编辑了这些构造函数:
@Entity @Table (name = "ponto") public class Ponto implements java.io.Serializable { @Id @GeneratedValue private Integer id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="cliente", nullable=true) private UsuarioCliente cliente; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="loja", nullable=false) private UsuarioLoja loja; @Column(name="dataCriacao") private Date dataCriacao; @Column(name="dataUtilizado", length=12, nullable=true) private Date dataUtilizado; @Column(name="dataExpira") private Date dataExpira; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "funcionario", nullable=true) private Funcionario funcionario; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "pontoReceber", nullable=true) private PontoReceber pontoReceber; @Column(name="qtdPontos", nullable=false) private long qtdPontos; @Column(name="obsPontos", nullable = true,length=300) private String obsPontos; @NotEmpty @Column(name="tipo",nullable = true) private Integer tipo; public Ponto() { } public Ponto(UsuarioCliente cliente, UsuarioLoja loja, long qtdPontos) { this.cliente = cliente; this.loja = loja; this.qtdPontos = qtdPontos; } // getters and setters }
和HQL:
Query q = getSession().createQuery("select new Ponto(ss.cliente,ss.loja,sum(ss.qtdPontos) as qtdPontos) " + "from Ponto as ss where ss.loja.id = :idLoja " + "group by ss.cliente, ss.loja"); q.setParameter("idLoja", idLoja);
这个问题四天了,我哭得像个婴儿。
感谢指导Thufir Hawat。