Consulta com Hibernate SQL

12 respostas
N

Eu tenho 2 classes: Professor e Disciplina onde eu tenho um relacionamento ManyToMany.
Professor:

@NamedQueries({
		@NamedQuery(name = "Professor.findAll", query = "SELECT p FROM Professor p"),
		@NamedQuery(name = "Professor.findByNome", query = "SELECT p FROM Professor p WHERE lower(p.nome) like concat('%',lower(:nome),'%')"), })
@Entity
@Table(name = "professor")
@PrimaryKeyJoinColumn(name = "id_pessoaFisica", referencedColumnName = "id_pessoa")
public class Professor extends PessoaFisica {

	@ManyToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER)
	@JoinColumn(name = "id_professor")
	private List<Disciplina> disciplinas = new ArrayList<Disciplina>();
}

Disciplina:

@NamedQueries({
	@NamedQuery(name="Disciplina.findAll", query="SELECT d FROM Disciplina d"),
	@NamedQuery(name="Disciplina.findByNome", query="SELECT d FROM Disciplina d WHERE lower(d.nome) like concat('%',lower(:nome),'%')"),
	@NamedQuery(name="Disciplina.nomeEmUso", query="SELECT d FROM Disciplina d WHERE lower(d.nome) like lower(:nome)"),
	@NamedQuery(name="Disciplina.findAllSemProfessor", query="SELECT d FROM Disciplina d, Professor p WHERE p.id != :id")
})

@Entity
@Table(name="disciplina")
public class Disciplina {	

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private long id;
	
	@Column(unique=true)
	private String nome;

Como vocês podem observar eu estou utilizando @NamedQueries para construir minhas consultas, eu gostaria de retornar todas as disciplinas que não fazem parte de um professor x. Para isso eu tentei:

@NamedQuery(name="Disciplina.findAllSemProfessor", query="SELECT d FROM Disciplina d, Professor p WHERE p.id != :id")

Mas essa consulta está me retornando uma lista vazia, mesmo contendo disciplinas cadastradas no banco. Alguém sabe como faço pra arrumar isso?

12 Respostas

ViniGodoy

Por favor, não banalize as tags como [Resolvido], [Hibernate] ou qualquer outra, colocando uma informação inútil, como [Dúvida] ou [Ajuda]. Como 99% dos nossos tópicos são dúvidas, usar uma tag para dizer o óbvio só deixa menos evidente as importantes.

Também movi seu tópico para o fórum de persistência.

N

Desculpa ViniGodoy, já foi corrigido :slight_smile:

Scoobydoo

Nick, falta um relacionamento na sua consulta…

Você precisa colocar alguma relação entre professor e disciplina como

N

Mas é que eu não tenho um atributo professor em disciplina, a única relação que eles tem é que professor tem uma lista de disciplinas. Que no banco cria uma tabela com as duas pks, professor e disciplina id.

Scoobydoo

Então em vez de fazer assim tenta

Você precisa colocar alguma relação entre professor e disciplina como

Você obrigatoriamente precisa mostrar ao banco de dados(Através do select), qual a relação que você tem entre P e D.

N

Opa Scoobydoo, acabei de testar aqui e ele ta dando erro de sintaxe:
Consulta

@NamedQuery(name="Disciplina.findAllSemProfessor", query="SELECT d FROM Disciplina d, Professor p WHERE p.id != :id and d in(p.disciplinas)")

StackTrace:

Caused by: org.hibernate.exception.SQLGrammarException: could not execute query
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
	at org.hibernate.loader.Loader.doList(Loader.java:2223)
	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
	at org.hibernate.loader.Loader.list(Loader.java:2099)
	at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
	at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
	at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
	at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
	at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:66)
	... 155 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '))' at line 1
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
	at com.mysql.jdbc.Util.getInstance(Util.java:381)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3515)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3447)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1951)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2101)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2554)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1761)
	at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1912)
	at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
	a
15:55:49,072 ERROR [STDERR] t org.hibernate.loader.Loader.getResultSet(Loader.java:1787)
	at org.hibernate.loader.Loader.doQuery(Loader.java:674)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
	at org.hibernate.loader.Loader.doList(Loader.java:2220)
	... 163 more

Você sabe pra que serve essa função in()?

N

Bom Scooby, eu estava pensando aqui com meus botões, quando eu uso por exemplo SELECT d FROM Disciplina d, Professor p eu estou selecionando todas as disciplinas que tem alguma relação com professor, certo? Se for isso minha consulta ta errada então, porque nem todas as disciplinas tem relação com o professor.

romarcio

Você tem um atributo Professor na classe Disciplina? Ou, você tem um chave estrangeira na tabela Disciplinas referente a Professores?

N

Nem um nem outro, eu tenho uma lista de Disciplinas em Professor, com a annotation @ManyToMany. Ae o hibernate cria sozinho uma tabela com as pk de Professor e Disciplina.

romarcio

Acho que não vai dar para fazer com HQL em NamedQuery, por que você não pode trabalhar com a lista dentro da string do HQL.
Com critéria eu faria assim:

public List&lt;Disciplina&gt; findAllSemProfessor(Professor p) {
        return getSession().createCriteria(Disciplina.class)
                .add(Restrictions.not(Restrictions.idEq(p.getId())))
                .list();
    }
pmlm

Tens de ter também a lista de professores na disciplina, com a anotação de ManyToMany. E o que tu queres é as disciplinas que têm essa lista vazia.

Scoobydoo

Não entendi porque ta dando esse erro de sintaxe...
Mostra as tuas classes e onde você chama sua query ....
Coloque a tag [code] não esqueça..

Criado 6 de outubro de 2011
Ultima resposta 10 de out. de 2011
Respostas 12
Participantes 5