[Resolvido]problema inner join hql

Alguém sabe me dizer o que estou fazendo de errado neste hql, pois não funfa… me retorna a seguinte exception:

12:13:56,999 ERROR [PARSER] line 1:122: unexpected token: on
Caused by: org.hibernate.hql.ast.QuerySyntaxException: unexpected token: on near line 1, column 122 [from br.mil.eb.dgp.sirf3.negocio.entidade.militar.CursoDgp cursoDgp inner join EstabelecimentoCurso estabelecimentoCurso on estabelecimentoCurso.CURSO_COD = cursoDgp.CODIGO WHERE estabelecimentoCurso.ORGAO_COD = :CODOM ORDER BY 2]

Nos forums que li, todos usam a palavra chave ON para fazer inner join no HQL…

Minha HQL

public static final String HQL_CURSOS_ESTAGIOS_MILITARES_POR_OM = 
		"from CursoDgp cursoDgp " +
		"inner join EstabelecimentoCurso estabelecimentoCurso " +
		"on estabelecimentoCurso.CURSO_COD = cursoDgp.CODIGO " +
		"WHERE estabelecimentoCurso.ORGAO_COD = :CODOM " +
		"ORDER BY 2";

Método que chama a consulta

public List<CursoDgp> cursosEstagiosMilitaresPorOm(Orgao orgao){
		Query query = hibernateSessionSirf3.createQuery(HQL_CURSOS_ESTAGIOS_MILITARES_POR_OM);
		query.setString("CODOM", orgao.getCodom());
		
		return (List<CursoDgp>)query.list();
	}

Só pra constar, este é o sql que executei no banco e retorna os resultados tranquilo

SELECT CD.CODIGO, CD.DESC_CURSO
FROM RH_QUADRO.CURSO_DGP CD
INNER JOIN RH_QUADRO.ESTABELECIMENTO_CURSO EC ON EC.CURSO_COD = CD.CODIGO
WHERE EC.ORGAO_COD = 24679
ORDER BY 2

HQL tem algumas diferenças do SQL.

Acho que é mais ou menos isso que vc quer:

"select estabelecimentoCurso"+ "from EstabelecimentoCurso estabelecimentoCurso " + "inner join estabelecimentoCurso.cursoDgp cursoDgp " + "WHERE estabelecimentoCurso.orgaoCod = :CODOM " + "ORDER BY <substitui isso pelo nome do campo que vc quer>"

O HQL resolve a clausula “ON” do SQL sozinho.

Acho que tá faltando o SELECT no começo do seu HQL.

Eu preciso mostrar o código e a descrição do curso na combo e não o estabelecimento de Ensino…

minha Entidade EstabelecimentoCurso possui chave composta e está mapeada da seguinte forma:

@EmbeddedId
	@AttributeOverrides( {
			@AttributeOverride(name = "orgaoCurso", column = @Column(name = "ORGAO_COD")),
			@AttributeOverride(name = "cursoDgp", column = @Column(name = "CURSO_COD"))})
	private EstabelecimentoCursoId estabelecimentoCursoId;
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "CURSO_COD",insertable=false, updatable=false)
	private CursoDgp cursoDgp;

A classe CursoDgp

@Entity
@Table(name = "CURSO_DGP", schema="RH_QUADRO")
@Name("cursoDGP")
public class CursoDgp implements java.io.Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 5435226145884204767L;
	@Id
	@Column(name = "CODIGO", unique = true, nullable = false, length = 6)
	private String codigo;
	
	@Column(name = "COD_CURSO_ANTIGO", length = 6)
	private String codCursoAntigo;
	
	@ManyToOne(fetch=FetchType.EAGER)
	@JoinColumn(name = "NC_COD_NAT_CURSO")	
	private TipoNaturezaCurso tipoNaturezaCurso;
	
	@ManyToOne(fetch=FetchType.EAGER)
	@JoinColumn(name = "TC_COD_TIPO_CURSO")	
	private TipoCurso tipoCurso;
	
	@Column(name = "DESC_CURSO", length = 160)
	private String descCurso;

alterei minha hql retirando a palavra chave ON e consertando alguns errinhos, mas ele reclama a falta de um join:

public static final String HQL_CURSOS_ESTAGIOS_MILITARES_POR_OM = 
		"from CursoDgp cursoDgp " +
		"inner join EstabelecimentoCurso estabelecimentoCurso " +
		"where estabelecimentoCurso.cursoDgp = cursoDgp.codigo " +
		"and estabelecimentoCurso.ORGAO_COD = :CODOM " +
		"ORDER BY cursoDgp.descCurso";

Caused by: org.hibernate.hql.ast.QuerySyntaxException: Path expected for join! [from br.mil.eb.dgp.sirf3.negocio.entidade.militar.CursoDgp cursoDgp inner join EstabelecimentoCurso estabelecimentoCurso where estabelecimentoCurso.cursoDgp = cursoDgp.codigo and estabelecimentoCurso.ORGAO_COD = :CODOM ORDER BY 2]

cara, porque vc nao habilita o show sql , para aparecer o sql no console ??

[quote=kelvis]Eu preciso mostrar o código e a descrição do curso na combo e não o estabelecimento de Ensino…

minha Entidade EstabelecimentoCurso possui chave composta e está mapeada da seguinte forma:

@EmbeddedId
	@AttributeOverrides( {
			@AttributeOverride(name = "orgaoCurso", column = @Column(name = "ORGAO_COD")),
			@AttributeOverride(name = "cursoDgp", column = @Column(name = "CURSO_COD"))})
	private EstabelecimentoCursoId estabelecimentoCursoId;
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "CURSO_COD",insertable=false, updatable=false)
	private CursoDgp cursoDgp;

A classe CursoDgp

@Entity
@Table(name = "CURSO_DGP", schema="RH_QUADRO")
@Name("cursoDGP")
public class CursoDgp implements java.io.Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 5435226145884204767L;
	@Id
	@Column(name = "CODIGO", unique = true, nullable = false, length = 6)
	private String codigo;
	
	@Column(name = "COD_CURSO_ANTIGO", length = 6)
	private String codCursoAntigo;
	
	@ManyToOne(fetch=FetchType.EAGER)
	@JoinColumn(name = "NC_COD_NAT_CURSO")	
	private TipoNaturezaCurso tipoNaturezaCurso;
	
	@ManyToOne(fetch=FetchType.EAGER)
	@JoinColumn(name = "TC_COD_TIPO_CURSO")	
	private TipoCurso tipoCurso;
	
	@Column(name = "DESC_CURSO", length = 160)
	private String descCurso;

alterei minha hql retirando a palavra chave ON e consertando alguns errinhos, mas ele reclama a falta de um join:

public static final String HQL_CURSOS_ESTAGIOS_MILITARES_POR_OM = 
		"from CursoDgp cursoDgp " +
		"inner join EstabelecimentoCurso estabelecimentoCurso " +
		"where estabelecimentoCurso.cursoDgp = cursoDgp.codigo " +
		"and estabelecimentoCurso.ORGAO_COD = :CODOM " +
		"ORDER BY cursoDgp.descCurso";

Caused by: org.hibernate.hql.ast.QuerySyntaxException: Path expected for join! [from br.mil.eb.dgp.sirf3.negocio.entidade.militar.CursoDgp cursoDgp inner join EstabelecimentoCurso estabelecimentoCurso where estabelecimentoCurso.cursoDgp = cursoDgp.codigo and estabelecimentoCurso.ORGAO_COD = :CODOM ORDER BY 2][/quote]

Seu JOIN está errado, me corrija se eu estiver errado na sua entidade EstabelecimentoCurso vc tem um atributo do tipo CursoDgp?

Se tiver o join tem que parecer com isso:

 ...  EstabelecimentoCurso ec inner join  ec.cursoDgp cDpg ... 

tá Habilitado… ele não chega a montar a consulta porque dá o erro de sintax logo de cara!

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html

isso mesmo gustavorozolin … vou refazer aqui e já posto o resultado o/

Resolvido galera… deu certo de duas formas, segui a dica do gustavorozolin

Tô usando esta sem o token JOIN…

public static final String HQL_CURSOS_ESTAGIOS_MILITARES_POR_OM = 
		"select cursoDgp from CursoDgp as cursoDgp," +
		"EstabelecimentoCurso as estabelecimentoCurso " +
		"where estabelecimentoCurso.cursoDgp = cursoDgp.codigo " +
		"and estabelecimentoCurso.orgaoCurso = :CODOM " +
		"ORDER BY cursoDgp.descCurso";

E assim usando Join ;D

	public static final String HQL_CURSOS_ESTAGIOS_MILITARES_POR_ORGAO = 
		"Select estabelecimentoCurso.cursoDgp from EstabelecimentoCurso as estabelecimentoCurso " +
		"join estabelecimentoCurso.cursoDgp as cursoDgp " +
		"where estabelecimentoCurso.orgaoCurso = :CODOM " +
		"order by cursoDgp.descCurso";

Vlw pela ajuda!