Tentando utilizar uma sql normal no hibernate

9 respostas
M

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.

9 Respostas

rafadelnero

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

AmauriSpPoa

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

M

Poisé mas existe. :expressionless:

Como funciona essa cláusula?

Rodrigo_Sasaki

Existe a tabela Lancamento ou a entidade Lancamento?

M

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.

Rodrigo_Sasaki

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.
É o caminho da tabela no banco.

M

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.

V

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.

M

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

Criado 19 de dezembro de 2012
Ultima resposta 19 de dez. de 2012
Respostas 9
Participantes 5