Subqueries notExists Hibernate

0 respostas
robinsonbsilva

Bom dia,

Gostaria muito de aprender como fazer uma consulta equivalente a esse HQL abaixo usando Criteria, para a seguintes classes.

HQL

StringBuilder hql = new StringBuilder("");
hql.append(" FROM Produto p ");
hql.append(" WHERE p.excluido IS NULL ");
hql.append("   AND NOT EXISTS(FROM Estoque e WHERE e.produto = p) ");
hql.append(" ORDER BY p.nome ");
DetachedCriteria dc = DetachedCriteria.forClass(Estoque.class, "e");
dc.add(Restrictions.eqProperty("e.produto", "produto")).setProjection(Projections.id());
criterion.add(Subqueries.notExists(dc));

Classe Produto

@Entity
@Table(schema = "public", name = "produto")
@SequenceGenerator(name = "id_creator", sequenceName = "produto_id")
public class Produto implements java.io.Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "id_creator")
    @Column(name = "id")
    private Long id;

    @OneToOne(cascade = CascadeType.REFRESH)
    @JoinColumn(name = "id_tipo_produto", nullable = false)
    private TipoProduto tipoProduto;

    @Column(name = "codigo_barra", nullable = true, length = 13)
    private String codigoBarra;

    @Column(name = "nome", nullable = false, length = 50)
    private String nome;

    @Column(name = "valor_custo", nullable = false, length = 13, precision = 4)
    private Double valorCusto;

    @Column(name = "valor_atacado", nullable = false, length = 13, precision = 4)
    private Double valorAtacado;

    @Column(name = "valor_varejo", nullable = false, length = 13, precision = 4)
    private Double valorVarejo;

    @Lob
    @Basic(fetch = FetchType.EAGER)
    @Column(name = "imagem")
    private byte[] imagem;

    @Column(name = "data_excluido", nullable = true)
    @Temporal(TemporalType.TIMESTAMP)
    private Date dataExcluido;

    @Column(name = "excluido", nullable = true, length = 1)
    private Short excluido;

    @Column(name = "id_funcionario_exclusao", nullable = true)
    private Long idFuncionarioExclusao;

    @OneToMany(mappedBy = "produto", cascade = CascadeType.REFRESH)
    private List<FornecedorProduto> fornecedores;
}

Classe Estoque

@Entity
@Table(schema = "public", name = "estoque")
public class Estoque implements java.io.Serializable {

    @Id
    @ManyToOne(cascade = CascadeType.REFRESH)
    @JoinColumn(name = "id_produto", nullable = false)
    private Produto produto;

    @Column(name = "qtde_minima", nullable = false)
    private Double quantidadeMinima;

    @Column(name = "qtde_maxima", nullable = false)
    private Double quantidadeMaxima;

    @Column(name = "qtde_saldo", nullable = false)
    private Double quantidadeSaldo;

    @Column(name = "data_atualizacao", nullable = true)
    @Temporal(TemporalType.TIMESTAMP)
    private Date dataAtualizacao;

    @ManyToOne(cascade = CascadeType.REFRESH)
    @JoinColumn(name = "id_funcionario_atualizacao", nullable = true)
    private Funcionario funcionarioAtualizacao;
}
Criado 7 de julho de 2014
Respostas 0
Participantes 1