2
respostas

Hibernate SELECT com campos do objeto

Tenho uma classe com muitos campos, e gostaria de fazer pesquisa no banco de dados onde me retorne o id dos processos com os campos especificos, por exemplo, queria pedir um processo onde o resumoMercadoria fosse LIKE %tenis%, existe algum jeito de atingir esse objetivo com reflection ou com o próprio hibernate sem precisar criar um método no meu DAO para cada campo do meu objeto??

public class Processo {

    @Id
    @Column(name = "idprocesso")
    private Integer id;
    // Informações Basicas Processo
    @Column(name = "nrprocesso")
    private String referencia;
    @Column(name = "nrmanifesto")
    private String nrManifesto;
    @Column(name = "nrconhecimento")
    private String nrIndentificacao;
    @Column(name = "nrconhecmaster")
    private String nrIdentificacaoMaster;
    @Column(name = "tpcanal")
    private String canal;
    @Column(name = "txresumomercadoria")
    private String resumoMercadoria;
    @Column(name = "vlrpesobruto")
    private BigDecimal vlrPesoBruto;
    @Column(name = "vlrpesoliquido")
    private BigDecimal vlrPesoLiquido;
    @Column(name = "nrplacaveiculo")
    private String placaVeiculo;
    @Column(name = "nrpresencacarga")
    private String nrCeMercante;

    @Column(name = "dtdesembaraco")
    private LocalDateTime dtDesembaraco;
    @Column(name = "dtliberacaofaturamento")
    private LocalDateTime dtLiberacaoFaturamento;
    @Column(name = "dtabertura")
    private LocalDateTime dtAbertura;
    @Column(name = "dtembarque")
    private LocalDateTime dtEmbarque;
    @Column(name = "dtchegada")
    private LocalDateTime dtChegada;

    //Informações do processo em outras tabelas
    @OneToOne( optional = true)
    @JoinColumn(name = "idservico", referencedColumnName = "idservico")
    @Fetch( FetchMode.JOIN )
    private Servico servico;
    @OneToOne( optional = true)
    @JoinColumn(name = "idpessoacliente", referencedColumnName = "idpessoa")
    @Fetch( FetchMode.JOIN )
    private Pessoa cliente;
    @OneToOne( optional = true)
    @JoinColumn(name = "idlocalembarque", referencedColumnName = "idterminalcarga")
    @Fetch( FetchMode.JOIN )
    private TerminalCarga localOrigem;
    @OneToOne( optional = true)
    @JoinColumn(name = "idlocaldesembarque", referencedColumnName = "idterminalcarga")
    @Fetch( FetchMode.JOIN )
    private TerminalCarga localDestino;
    @OneToOne( optional = true)
    @JoinColumn(name = "idarmazemdesembaraco", referencedColumnName = "idarmazem")
    @Fetch( FetchMode.JOIN )
    private Armazem armazemAlfandegado;
    @OneToOne( optional = true)
    @JoinColumn(name = "idviatransporte", referencedColumnName = "idviatransporte")
    @Fetch( FetchMode.JOIN )
    private ViaTransporte transportadora;
    @OneToOne( optional = true)
    @JoinColumn(name = "idpessoaagente", referencedColumnName = "idpessoa")
    @Fetch( FetchMode.JOIN )
    private Pessoa agenteDeCarga;
    @OneToOne(optional = true)
    @Fetch( FetchMode.JOIN )
    @JoinColumn(name = "idpessoaetranspitl", referencedColumnName = "idpessoa")
    private Pessoa companhia;
    @OneToOne(mappedBy = "processo")
    @Fetch( FetchMode.JOIN )
    private DiCapa diCapa;

    //Informações que podem conter mais de uma por processo
    @OneToMany(fetch=FetchType.LAZY)
    @JoinColumn(name = "idprocesso", referencedColumnName = "idprocesso")
    @Fetch( FetchMode.JOIN )
    private Set<DiAdicao> diAdicao;
    @OneToMany(fetch=FetchType.LAZY)
    @JoinColumn(name = "idprocesso", referencedColumnName = "idprocesso")
    @Fetch( FetchMode.JOIN )
    private Set<DiItem> diItens;
    @OneToMany(fetch=FetchType.LAZY)
    @JoinColumn(name = "idprocesso", referencedColumnName = "idprocesso")
    @Fetch( FetchMode.JOIN )
    private Set<ProcessoVolume> processoVolume;
    @OneToMany(fetch=FetchType.LAZY)
    @JoinColumn(name = "idprocesso", referencedColumnName = "idprocesso")
    @Fetch( FetchMode.JOIN )
    private Set<ProcessoContainer> processoContainer;
    @OneToMany(fetch=FetchType.LAZY)
    @JoinColumn(name = "idprocesso", referencedColumnName = "idprocesso")
    @Fetch( FetchMode.JOIN )
    private Set<ReferenciaCliente> referenciaCliente;
    @OneToMany(fetch=FetchType.LAZY)
    @JoinColumn(name = "idprocesso", referencedColumnName = "idprocesso")
    @Fetch( FetchMode.JOIN )
    private Set<ProcessoDocInstrucaoDespacho> processoDocInstrucaoDespacho;
2 respostas

Lucas, tudo bem ?

Cara, imagino que com Criteria você consiga fazer algo bem próximo a isso que você deseja.

Estou usando a versão 5.2 do hibernate e na documentação eles dizem:

"Hibernate offers an older, legacy org.hibernate.Criteria API which should be considered deprecated. No feature development will target those APIs. Eventually, Hibernate-specific criteria features will be ported as extensions to the JPA javax.persistence.criteria.CriteriaQuery. For details on the org.hibernate.Criteria API, see Legacy Hibernate Criteria Queries.

This chapter will focus on the JPA APIs for declaring type-safe criteria queries."