2013-05-02 16 views
8

JPA 2.0 kullanıyorum. Hibernate 4.1.0.Final ve Java 6. Aşağıdaki psuedo-SQL'den bir JPA sorgusunu nasıl yazarım?JPA 2.0'da nerede bir yan tümce ile bir MAX sorgusu yazarım?

@GenericGenerator(name = "uuid-strategy", strategy = "org.mainco.subco.core.util.subcoUUIDGenerator") 
@Entity 
@Table(name = "sb__event", 
    uniqueConstraints = { @UniqueConstraint(columnNames={"EVENT_ID"}) } 
) 
public class Event 
{ 

    @Id 
    @Column(name = "ID") 
    @GeneratedValue(generator = "uuid-strategy") 
    private String id; 

    @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.REMOVE}) 
    @JoinColumn(name = "ORGANIZATION_ID", nullable = false, updatable = true) 
    private Organization org; 

    @Column(name = "DATE_PROCESSED") 
    @NotNull 
    private java.util.Date dateProcessed; 

Ben CriteriaBuilder.greatest yer aldığını biliyoruz, ama sadece sorgu yazma bilemiyorum:

select max(e.dateProcessed) from Event e where e.org = myOrg 

Ve Alan nesnesi aşağıdaki gibi görünüyor. Bu, organizasyonla eşleşen tüm etkinlik nesnelerini döndürecek, ancak aldığım kadarıyla.

final CriteriaBuilder builder = m_entityManager.getCriteriaBuilder(); 
final CriteriaQuery<Event> criteria = builder.createQuery(Event.class); 
final Root<Event> event = criteria.from(Event.class); 
criteria.select(event); 
criteria.where(builder.equal(Event.get("org"), org)); 
results.addAll(m_entityManager.createQuery(criteria).getResultList()); 

cevap

21

JPQL kullanan, diğeri ölçüt sorgularını kullanan iki yol vardır.
JPQL basitçe: kriterlerini kullanırken

em.createQuery("select max(e.dateProcessed) from Event e where e.org = :myOrg") 
    .setParameter("myOrg", myOrg) 
    .getSingleResult(); 

aşağıdakiler bulunabilir: With

CriteriaBuilder qb = em.getCriteriaBuilder(); 
CriteriaQuery<Number> cq = qb.createQuery(Number.class); 
Root<Event> root = cq.from(Event.class); 
cq.select(qb.max(root.get("dateProcessed"))); 
cq.where(qb.equal(Event.get("org"), qb.parameter(MyOrgType.class, "myOrg"))); 
em.createQuery(cq).setParameter("myOrg", myOrg).getSingleResult(); 
+0

Ben bir "java.util.Date dönmek istiyorum bu yana, "Çizgiyi değiştirdiğimi sanıyorum" CriteriaQuery cq = qb.createQuery (Number.class); " "CriteriaQuery cq = qb.createQuery (Date.class);". Her iki durumda da "cq.select (qb.max (root.get (" dateProcessed "))) satırında bir derleme hatası alıyorum;". Şöyle ki: Ben yapmadım – Dave

+3

"Bound uyuşmazlığı. Tipi CriteriaBuilder jenerik yöntem max (Expression ) argümanlar (Yol ) türetilmiş tip Nesne sınırlı parametre için geçerli bir yerini tutmaz için geçerli değildir " Max'in, yalnızca herhangi bir yol ifadesini kabul edecek JPQL max ifadesinden farklı olan İfadesini aldığını farketmez. Bu, http://stackoverflow.com/questions/9616390/select-max-timestamp-with-jpa2-criteria-api – Chris

+4

"En büyük" ('root.get ("dateProcessed")' i değiştirerek 'root.get (Event_.dateProcessed)') her şey harika çalıştı. – Dave

0

JPQL ve CriteriaBuilder

CriteriaBuilder cb = getEntityManager().getCriteriaBuilder(); 
javax.persistence.criteria.CriteriaQuery cq= getEntityManager().getCriteriaBuilder().createQuery(); 
Root<T> c = cq.from(getEntityClass()); 
cq.select(cb.max(c.get("id"))); 
İlgili konular