Representar em Hibernate

Pessoal, já tentei a morrer e não consegui…

como represento essa query no hibernate?

select distinct cat.* from categoria cat where cat.pk_categoria not in (select fk_categoria from produtocat where fk_produto = 33)

Obrigado a todos…

Ola,

Você poderia descrever resumidamente os objetos que estão envolvidos na query que você quer fazer, e que tipo de resultado você quer?
Vamos pensar em objetos a principio. Esqueça sql.

Uma coisa a ser observada é que o comando in no Sql pode ser substituído por um inner join, coisa que eu acredito que seja mais fácil de fazer no HSLQ.

Então, eu quero buscar as categorias que não estão na tabela produtocat para um determinado id de produto.

meu model de categoria:

[code]@Entity
@Table(name = “categoria”)
public class Categoria {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = “CAT_SEQ”)
@SequenceGenerator(name = “CAT_SEQ”, sequenceName = “categoria_pk_categoria_seq”, allocationSize = 1)
@Column(name = “pk_categoria”)
private Integer categoriaId;

private String catDescricao;[/code]

meu model de produtocat

[code]@Entity
@Table(name = “produtocat”)
public class ProdutoCat {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = “PRODUTOCAT_SEQ”)
@SequenceGenerator(name = “PRODUTOCAT_SEQ”, sequenceName = “produtocat_pk_produtocategoria_seq”, allocationSize = 1)
@Column(name = “pk_produtocategoria”)
private Integer produtoCatId;

@ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@JoinColumn(name = "fk_categoria")
private Categoria categoria;[/code]

obrigado…

[quote=leonardocregis]Uma coisa a ser observada é que o comando in no Sql pode ser substituído por um inner join, coisa que eu acredito que seja mais fácil de fazer no HSLQ.

[/quote]

Isso é uma verdade, tentei fazer com INNER JOIN e não consegui…

Obrigado…

Ola,

Se vc puder usar criteria, tente começar por aqui:
http://www.javafree.org/javabb/viewtopic.jbb?t=856842

Olá Rodrigo,

tinha visto esse tópico, dei uma pesquisada, mas não consegui aplicar dessa forma…

Obrigado.

Depois de alguns testes cheguei aqui:

[code]public static List<Categoria> listarItemsRelacionados() {
	session = HibernateUtil.getSession();
	try {
		session.beginTransaction();
		List<Categoria> result = session
				.createQuery(
						"from Categoria where categoriaId not in (select produtoCatId from ProdutoCat where produto = 9)")
				.list();
		

		session.getTransaction().commit();
		session.close();

		return result;
	} catch (HibernateException ex) {
		ex.printStackTrace();
		session.close();
		return null;
	}
}[/code]

funcionou parcialmente, ele está me trazendo um item a mais… alguém sabe porque?

Obrigado…

resolvido, tinha errado o nome do campo…

:twisted:

List result = session
.createQuery(
“Select categoria
from Categoria categoria
inner join categoria.produtos produto
where produto.produtoCatId = 9)”
).list();

Você pode ter o mesmo resultado com o query acima.
Claro que provavelmente eu não botei o nome certo na parte que diz categoria.produtos,mas em essencia é o nome que você mapeou para o item.

Tentei vários INNER JOIN inclusive acho que esse que vc fez tbm, e não deram certo, à noite vou testar e posto aqui.

Obrigado… :slight_smile:

O grande probelma desse query é que se você não colocar o Select na frente ele retorna um
object[] e fica bem confuso mesmo…

Não sei se foi isso que você teve problema.