JPA Criteria

Boa tarde,

tenho uma classe corretamente persistindo em banco e gostaria de localizar
um objeto por duas propriedades dele. Qual a melhor maneira de se fazer isso
utilizando criteria ?

Tentei varias formas aqui, mais não consegui …

Obrigado pela ajuda desde já !

Olá!
Use Projections para escolher os atributos que deseja do objeto:
Listando vários contatos:

	public List<Contato> listaContato() {
		return session.createCriteria(Contato.class, "c")
		.setProjection(Projections.projectionList()
				.add( Projections.property("c.idContato").as("idContato") )
				.add( Projections.property("c.email").as("email") )
				.add( Projections.property("c.nome").as("nome") )
				.add( Projections.property("c.dtInclusao").as("dtInclusao") )
				).setResultTransformer(new AliasToBeanResultTransformer(Contato.class))
				.addOrder(Order.desc("dtInclusao")).list();

Exemplo: Obtendo um contato e alguns atributos:

public Contato carrega() {
		return session.createCriteria(Contato.class, "c")
		.setProjection(Projections.projectionList()
				.add( Projections.property("c.idContato").as("idContato") )
				.add( Projections.property("c.email").as("email") )
				.add( Projections.property("c.nome").as("nome") )
				.add( Projections.property("c.dtInclusao").as("dtInclusao") )
				).setResultTransformer(new AliasToBeanResultTransformer(Contato.class)).uniqueResult();

Se a ide sugerir alguma mudança na query, tipo um Cast, aceite e veja o resultado.
Abraço!

estou usando JPA, minha variavel de EntityManager é em
e ele não da a opção de usar createCriteria …

ja tenho esse metodo funcionando …

public List<T> lista() { CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); cq.select(cq.from(classe)); Query q = em.createQuery(cq); return q.getResultList(); }

public List<T> lista() {  
  CriteriaBuilder cb = em.getCriteriaBuilder();
  CriteriaQuery<Contato> cq = em.createCriteriaQuery(Contato.class);
  Root<Contato> from = cq.from(Contato.class);
  Predicate filter = cb.and(cb.gt(from.get(Contato_.idade, 18)), cb.equal(Contato_.sexo, "F"));
  cq.where(filter);
  TypedQuery<Contato> query = em.createQuery(cq);
  return query.getResultList();
}  

Onde [c]Contato_[/b] é o metamodelo da class Contato:

// Contato
@Entity
public class Contato implements Serializable {
  private Integer idade;
  private String sexo;

  // Getters e setters.
}

// Metamodelo
@StaticMetamodel(Contato.class)
public class Contato_ {
  public static volatile SingularAttribute<Contato, Integer> idade;
  public static volatile SingularAttribute<Contato, String> sexo;
}

[urlhttp://www.ibm.com/developerworks/java/library/j-typesafejpa/[/url]
Da uma olhada tb nesse link ai em cima. É melhor tutorial q eu já achei sobre JPA2 criteria. Embora algumas coisas possam estar meio diferentes. Mais uma coisa, lembre-se de q pela complexidade, criteria só é interessante quando vc precisa criar queries dinamicamente, se não for esse o caso prefira o uso de NamedQueries, elas vão te poupa linhas de código e muito tempo.