Criteria![Resolvido]

Boa tarde galera, estou apanhando para fazer um criteria que me retorne os materiais da produtora, porem esses materiais tem estar com os status aprovados para aparecer… estou fazendo da seguinte maneira

public List<Material> consultaMateriais(Produtora produtora) {

        Criteria crit = session.createCriteria(Material.class);
if(produtora.getStatusEng == "Aprovado){
        crit.add(Restrictions.eq("produtora", produtora));
}
        return crit.list();
    }

Estou tentando assim porem não consigo ter resultando alguem sabe onde estou errando?

Não é assim que se faz. Está muito fora do que deve ser feito.
Para te ajudar, eu preciso saber um pouco mais sobre a classe Produtora e sua relação com a classe Material.
Se puder, posta essas classes.

ok amigo obrigado segue em baixo as classes

Material

@Entity
@Table(name="material")
@SequenceGenerator(name="material_seq" , sequenceName="material_seq")
public class Material implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO , generator="material_seq")
    @Column(name="id")
    private Long id;
    
    @Column(name="titulo")
    private String titulo;
    
    @Column(name="duaracao")
    private String duracao;
    
    @Column(name="dataMaterial")
    @Temporal(javax.persistence.TemporalType.TIMESTAMP)
    private Date dataMaterial;
    
    @Column(name="numeroMidia")
    private String numeroMidia;
   
    
    @Column(name="statusENG")
    private String statusEng;
    
    @Column(name="statusOPEC")
    private String statusOPEC;
    
    @Column(name="operador")
    private String operador;


    @ManyToOne
    @JoinColumn(name="id_produtora")
    private Produtora produtora;
   
    @ManyToOne
    @JoinColumn(name="id_cliente")
    private Cliente cliente;
   
    @ManyToOne
    @JoinColumn(name="id_midia")
    private Midia midia;
//GETTERS AND SETTERS

}

Produtora

@Entity
@Table(name="produtora")
@SequenceGenerator(name="produtora_seq" , sequenceName="produtora_seq")
public class Produtora implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO , generator="produtora_seq")
    @Column(name="id")
    private Long id;
    
    @Column(name="produtora")
    private String produtora;
   
    @Column(name="observacao")
    private String observacao;
    
    @Column(name="telefone")
    private String telefone;
    
    @Column(name="celular")
    private String celular;
  //Getters and Setters  
}

Só uma dúvida, nesse teste: if(produtora.getStatusEng == "Aprovado) Você está testando se produtora.getStatusEng é igual a aprovado.
Mas getStatusEng não tem na classe Produtora e sim na classe Material. Ta certo o que você postou referente a isso?

isso mesmo observei depois que fiz a pergunta uhahuahuha… eu não tenho relacionamento entre Produtora e Material :S! me desculpe

E então, ainda vai precisar de ajuda na consulta? Ou resolve sozinho?
Se for precisar de ajuda, explica o que vai precisar ok.

na verdade preciso sim! eu consegui fazer a Criteria para me trazer os materiais da produtora, pore agora eu preciso trazer os materiais da produtora que estegam com os Status da Engenharia (statusEng) como aprovado… esse status da eng é do tipo String pois tenho 4 tipos de status já devido vc poderia me ajudar?

Romarcio eu fiz com operador ternario! porem eu fico na duvida se isso é correto ou não

ficou assim o código:

<p:column rendered="#{m.statusEng == 'Aprovado' ? true:false}" >

porem como sou novo em Java não sei se seria correto eu usar o operador ternario para fazer funções de uma criteria!

Então:

public List&lt;Material&gt; consultaMateriais(String status) {  
	return getSession().createCriteria(Material.class).add(Restrictions.eq("statusEng", status)).list();
}  

mais essa criteria apenas me retorna os status, idependente de qual seja, eu preciso que me liste os materiais da produtora e se eles são aprovados ou não

Essa consulta vai te retornar uma lista com todos os materiais que possuem o “statusEng” igual a aprovado ou qualquer outro que enviar.
A lista vai ser formada por esses objetos do tipo Material e dentro desse objeto você vai ter acesso ao dados da Produtora, através do atributo “produtora”.

Quando eu fiz a restrição: Restrictions.eq("statusEng", status)
Estou dizendo que quero que retorne apenas quando statusEng == status.
Dai se status, recebido como parametro, vale ‘aprovado’, a consulta vai retornar apenas os aprovados.

aa legal, consegui visualizar a ideia vou fazer agora aqui, obrigado… porem aquele operador ternario que fiz logo acima é correto fazer? ou não??

Para a consulta não faz diferença. Passe apenas o status que quer pesquisar como parâmetro para o método.

Eu preciso fazer essa consulta na criteira!

SELECT *
FROM PRODUTORA P, MATERIAL M
WHERE P.ID = M.ID_PRODUTORA
AND M.STATUSENG = 'Aprovado';

[quote=nepsterbr]Eu preciso fazer essa consulta na criteira!

SELECT * FROM PRODUTORA P, MATERIAL M WHERE P.ID = M.ID_PRODUTORA AND M.STATUSENG = 'Aprovado'; [/quote]
A consulta que te passei faz exatamente isso. Embora não apareça o teste entre os id’s o hibernate faz isso por conta própria.

Veja no SQL que o hibernate monta e mostra no console quando você executa a consulta. Se esse SQL não está sendo exibido para você, adicione na configuração do hibernate a propriedade ‘hibernate.show_sql’ e sete seu valor como ‘true’.

ta eu fiz isso, mais e agora para mim filtrar por produtora dentro desta mesmo criteria?

Mas você precisa filtrar por qual atributo da produtora? Por que status não é da produtora é de material.
Coloca ai pra mim o select que você precisa transformar em criteria.

O Select é esse:

    SELECT *  
    FROM PRODUTORA P, MATERIAL M  
    WHERE P.ID = M.ID_PRODUTORA  
    AND M.STATUSENG = 'Aprovado'; 

Eu refiz o relacionamento de Material com produtora ficou assim

Material

    @ManyToOne
    @JoinColumn(name="id_produtora")
    private Produtora produtora;

Produtora

 @OneToMany(orphanRemoval=true,cascade= CascadeType.ALL,fetch= FetchType.LAZY,mappedBy="produtora",targetEntity=Material.class)
    private List<Material> materiais = new ArrayList<Material>();

O que estou tentando fazer é o seguinte tenho uma combo que me lista todas as produtoras, quando eu seleciono esta produtora eu tenho que disparar a criteria que me retorne os materiais dessa produtora e os que estejam com o status aprovado.