Crear consultas utilizando los Criterios de la API (JPA 2.0)

Estoy tratando de crear una consulta con los Criterios de la API de JPA 2.0, pero no puedo hacer que funcione.

El problema es con el «entre» método condicional. He leído algunos de documentación saber cómo tengo que hacerlo, pero ya que estoy descubriendo JPA, no entiendo por qué no funciona.

Primero, no veo a los «campos creationdate» que debe aparecer cuando escribo «Transaction_.»

Pensé que quizá fue normal, ya que he leído el metamodelo se ha generado en tiempo de ejecución, por lo que traté de usar ‘Loquesea_.getDeclaredSingularAttribute(«valor»)’ en lugar de ‘Loquesea_.valor», pero todavía no funciona en absoluto.

Aquí está mi código :

public List<Transaction> getTransactions(Date startDate, Date endDate) {
    EntityManager em = getEntityManager();
    try {
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Transaction> cq = cb.createQuery(Transaction.class);
        Metamodel m = em.getMetamodel();
        EntityType<Transaction> Transaction_ = m.entity(Transaction.class);
        Root<Transaction> transaction = cq.from(Transaction.class);

        //Error here. cannot find symbol. symbol: variable creationDate
        cq.where(cb.between(transaction.get(Transaction_.creationDate), startDate, endDate));

        //I also tried this:
        //cq.where(cb.between(Transaction_.getDeclaredSingularAttribute("creationDate"), startDate, endDate));

        List<Transaction> result = em.createQuery(cq).getResultList();
        return result;
    } finally {
        em.close();
    }
}

Alguien me puede ayudar a resolver esto? Gracias.

EDIT : aquí está la Transacción de origen (casi nada en él, ya que es automáticamente generado por Netbeans, desde mi base de datos)

package projetjava.db;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name = "transaction")
@NamedQueries({
    @NamedQuery(name = "Transaction.findAll", query = "SELECT t FROM Transaction t"),
    @NamedQuery(name = "Transaction.findById", query = "SELECT t FROM Transaction t WHERE t.id = :id"),
    @NamedQuery(name = "Transaction.findByIDAccount", query = "SELECT t FROM Transaction t WHERE t.iDAccount = :iDAccount"),
    @NamedQuery(name = "Transaction.findByDescription", query = "SELECT t FROM Transaction t WHERE t.description = :description"),
    @NamedQuery(name = "Transaction.findByCreationDate", query = "SELECT t FROM Transaction t WHERE t.creationDate = :creationDate"),
    @NamedQuery(name = "Transaction.findByAmount", query = "SELECT t FROM Transaction t WHERE t.amount = :amount")})
public class Transaction implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "ID")
    private Integer id;
    @Basic(optional = false)
    @Column(name = "IDAccount")
    private int iDAccount;
    @Basic(optional = false)
    @Column(name = "Description")
    private String description;
    @Basic(optional = false)
    @Column(name = "CreationDate")
    @Temporal(TemporalType.DATE)
    private Date creationDate;
    @Basic(optional = false)
    @Column(name = "Amount")
    private double amount;

    public Transaction() {
    }

    public Transaction(Integer id) {
        this.id = id;
    }

    public Transaction(Integer id, int iDAccount, String description, Date creationDate, double amount) {
        this.id = id;
        this.iDAccount = iDAccount;
        this.description = description;
        this.creationDate = creationDate;
        this.amount = amount;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public int getIDAccount() {
        return iDAccount;
    }

    public void setIDAccount(int iDAccount) {
        this.iDAccount = iDAccount;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Date getCreationDate() {
        return creationDate;
    }

    public void setCreationDate(Date creationDate) {
        this.creationDate = creationDate;
    }

    public double getAmount() {
        return amount;
    }

    public void setAmount(double amount) {
        this.amount = amount;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        //TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Transaction)) {
            return false;
        }
        Transaction other = (Transaction) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "projetjava.db.Transaction[id=" + id + "]";
    }

}
puedes publicar fuente para Transaction así?
Por favor, ver más abajo.

OriginalEl autor Pym | 2010-04-08

3 Kommentare

  1. 7

    Pensé que quizá fue normal, ya que he leído el metamodelo se ha generado en tiempo de ejecución (…)

    Metamodelo clases se generan en tiempo de compilación usando anotación de procesamiento de. En otras palabras, usted necesita para activar la anotación de procesamiento en el compilador de nivel. El Hibernate JPA 2 Metamodelo Generador documentación se describe cómo hacer que con Ant, Maven y IDEs como Eclipse o Idea (el enfoque puede ser aplicado a otros proveedores). Lamentablemente, esta función no es compatible actualmente en NetBeans.

    Para utilizar y configurar uno de los mencionados herramienta de construcción o cambiar a otro IDE. Por ejemplo, con Eclipse, haga clic en el proyecto e ir a Compilador de Java > Anotación de Procesamiento de y habilitarlo:

    Crear consultas utilizando los Criterios de la API (JPA 2.0)

    A continuación, añadir un VASO(s) de su proveedor (consulte la documentación de su JPA proveedor para este paso) a la Fábrica de Ruta.

    Gracias! Yo también tuve un vistazo a la Netbeans nightlies y parece que implemanted las mismas funcionalidades recientemente.
    Es bueno saber (entendía que esto iba a estar disponible en la NOTA de 6.9 que ha sido publicado recientemente en la versión Beta). Gracias por los comentarios.

    OriginalEl autor Pascal Thivent

  2. 2

    Creo que la parte confusa aquí es
    q.where(cb.between(transaction.get(Transaction_.creationDate), startDate, endDate));

    Usted debe notar que Transaction_ en este caso es estática instancia, canónica del metamodelo de la clase correspondiente a la Transacción original clase de entidad. Debe generar Transaction_ clase, mediante la compilación de su Transaction clase utilizando JPA bibliotecas.
    Un enlace útil está aquí para eclipse:
    http://wiki.eclipse.org/UserGuide/JPA/Using_the_Canonical_Model_Generator_%28ELUG%29

    Para intellij IDEA

    http://blogs.jetbrains.com/idea/2009/11/userfriendly-annotation-processing-support-jpa-20-metamodel/

    Puedo crear Transaction_ manualmente en algún lugar?
    Ahora seguro de cómo se va a entregar a crear el canónica del metamodelo. Está usted a través de la IDE? si es así, sigue aplicable enlaces o para eclipse, echa un vistazo a responder a continuación. Qué versión de Java que está utilizando? Un entendimiento implícito entre JPA proveedores es que se van a generar metamodelo mediante la anotación procesador integrado en el compilador de Java 6.

    OriginalEl autor ring bearer

  3. -2

    DE CONSULTA PARA LA FECHA DE INICIO Y FECHA FINAL EN JPA

    public List<Student> findStudentByReports(String className, Date startDate, Date endDate) {
        System.out
        .println("call findStudentMethd******************with this pattern"
                + className
                + startDate
                + endDate
                + "*********************************************");
    
        return em
        .createQuery(
                "select attendence from Attendence attendence where lower(attendence.className) like '"
                + className + "' or attendence.admissionDate BETWEEN : startdate AND endDate " + "'")
                .setParameter("startDate", startDate, TemporalType.DATE)
                .setParameter("endDate", endDate, TemporalType.DATE)
                .getResultList();
    }
    El OP quería utilizar la API de Criterios.

    OriginalEl autor Guntash

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea