Tentando utilizar uma sql normal no hibernate

Olá pessoal estava querendo utilizar a seguinte sql para poder somar o valor de todos os lançamentos realizados e multiplicalos pelo fator, fator esse que seria divida ou ganho, mas acho que não é ai que está o erro:

Código:

	public float saldo(Conta conta, Date data) {
		StringBuffer sql = new StringBuffer();
		sql.append("select sum(l.valor * c.fator)");
		sql.append(" from Lancamento l,");
		sql.append("    CATEGORIA c");
		sql.append(" where l.categoria = c.codigo");
		sql.append(" and l.conta = :conta");
		sql.append(" and l.data <= :data");
		SQLQuery query = this.session.createSQLQuery(sql.toString());
		query.setParameter("conta", conta.getConta());
		query.setParameter("data", data);
		BigDecimal saldo = (BigDecimal) query.uniqueResult();
		if(saldo != null){
			return saldo.floatValue();
		}
		

Erro:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'financeiro.Lancamento' doesn't exist
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
	at com.mysql.jdbc.Util.getInstance(Util.java:386)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1053)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2734)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
	at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2322)
	at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
	at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
	at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
	at org.hibernate.loader.Loader.getResultSet(Loader.java:1849)
	at org.hibernate.loader.Loader.doQuery(Loader.java:718)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270)
	at org.hibernate.loader.Loader.doList(Loader.java:2294)
	... 89 more

Sei que o erro está ai por que esse método é o unico que utiliza sql, teria alguma forma de setar onde fica a entidade? Pelo o que estou vendo o problema é sua localização…

Vlw até mais.

Bom dia Mathe, tente usar a cláusula GROUP BY, e agrupe pelas duas tabelas!

O erro está dizendo que você não tem um tabela Lancamento no eschema financeiro.

Poisé mas existe. :expressionless:

Como funciona essa cláusula?

Existe a tabela Lancamento ou a entidade Lancamento?

Então existe a entidade e a tabela Lancamento, só que a entidade não está no caminho que está apontando no erro, a entidade está no caminho financeiro.lancamento.Lancamento, e no erro está financeiro.Lancamento, não sei por que ele não encontra. Ou se o caminho mostrado no erro é o caminho da tabela no banco.

Então existe a entidade e a tabela Lancamento, só que a entidade não está no caminho que está apontando no erro, a entidade está no caminho financeiro.lancamento.Lancamento, e no erro está financeiro.Lancamento, não sei por que ele não encontra. Ou se o caminho mostrado no erro é o caminho da tabela no banco.[/quote]
É o caminho da tabela no banco.

Nossa velho o problema era o seguinte, eu tenho algumas tabelas no banco que foram criadas diretamente pelo hibernate e outras criadas via sql no banco mesmo, acontece que as criadas pelo hibernate iniciam pela letra maiuscula e as criadas na mão eu criava tudo minusculo mesmo, ele não conseguia executa a query porque as duas tabelas estavam com nomes errados, bom eu pelo menos não sabia que sql era camelCase, mais uma dúvida boba de muitas que viram vlw ai galera.

Isso é por causa que você não colocou o nome da tabela na sua classe, aí o hibernate cria a tabela conforme é definido o nome da sua classe.

Poisé tenho que me acustumar a colocar, vlw ai.