2011-01-19 21 views
5

He creado una aplicación usando JPA en un contenedor EJB. Aquí está mi códigoLenguaje de consulta JPA criteriaBuilder

@PersistenceContext(unitName = "damate-pu") 
private EntityManager em; 

@Override 
public Workspace find(String username, String path) { 
    CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); 
    CriteriaQuery<Workspace> criteriaQuery = criteriaBuilder.createQuery(Workspace.class); 
    Root<Workspace> from = criteriaQuery.from(Workspace.class); 
    Predicate condition = criteriaBuilder.equal(from.get("Username"), username); 
    Predicate condition2 = criteriaBuilder.equal(from.get("Path"), path); 
    Predicate condition3 = criteriaBuilder.and(condition, condition2); 
    criteriaQuery.where(condition3); 
    Query query = em.createQuery(criteriaQuery); 

    return (Workspace) query.getSingleResult(); 
} 

Cuando trato de ejecutar este método desde un servicio web me sale el siguiente error: java.lang.IllegalArgumentException: The attribute [Username] from the managed type....

Cuál puede ser el problema? Creo que tengo un problema con from.get("Username") ...
¿Qué opinas? ¿Y como arreglarlo?


Editar: Workspace.java

package com.ubb.damate.model; 

import java.io.Serializable; 
import javax.persistence.*; 
import java.util.Date; 
import java.util.Set; 


/** 
* The persistent class for the workspace database table. 
* 
*/ 
@Entity 
@Table(name="workspace") 
public class Workspace implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="WorkspaceId", unique=true, nullable=false) 
    private int workspaceId; 

    @Temporal(TemporalType.DATE) 
    @Column(name="CreationDate", nullable=false) 
    private Date creationDate; 

    @Lob() 
    @Column(name="Path", nullable=false) 
    private String path; 

    @Column(name="Username", nullable=false, length=20) 
    private String username; 

    //bi-directional many-to-one association to Project 
    @OneToMany(mappedBy="workspace") 
    private Set<Project> projects; 

    public Workspace() { 
    } 

    public int getWorkspaceId() { 
     return this.workspaceId; 
    } 

    public void setWorkspaceId(int workspaceId) { 
     this.workspaceId = workspaceId; 
    } 

    public Date getCreationDate() { 
     return this.creationDate; 
    } 

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

    public String getPath() { 
     return this.path; 
    } 

    public void setPath(String path) { 
     this.path = path; 
    } 

    public String getUsername() { 
     return this.username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    public Set<Project> getProjects() { 
     return this.projects; 
    } 

    public void setProjects(Set<Project> projects) { 
     this.projects = projects; 
    } 
} 

Respuesta

10

Cuando la construcción de los criterios de consulta (o edificio JPQL en una cadena), que desea utilizar los nombres de las propiedades entidad, no los nombres de columna. Su columna de base de datos se llama "Nombre de usuario", pero la propiedad del objeto Espacio de trabajo es "nombre de usuario" sin la U. capital

3

¿Usted ha intentado usar metamodelo?

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); 
Metamodel m = em.getMetamodel(); 
EntityType<Workspace> WS = m.entity(Workspace.class); 
CriteriaQuery<Workspace> criteriaQuery = criteriaBuilder.createQuery(Workspace.class); 
Root<Workspace> from = criteriaQuery.from(Workspace.class); 
Predicate condition = criteriaBuilder.equal(from.get(WS.username), username); 

http://download.oracle.com/javaee/6/tutorial/doc/gjivm.html

+0

No puedo obtener el nombre de usuario de WS. ¿Por qué es? –

+0

lo siento, se perdió la página correcta del doc. MetaModel http://download.oracle.com/javaee/6/tutorial/doc/gjiup.html – Osw

0
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); 
     CriteriaQuery<> criteriaQuery = criteriaBuilder 
       .createQuery(Date.class); 
     Root<test> root = criteriaQuery.from(test.class); 

     criteriaQuery.select(criteriaBuilder.greatest(root 
       .<Date> get("Starttime"))); 
     criteriaQuery.where(
       criteriaBuilder.equal(root.get("columnName 1"), filtervalue), 
       criteriaBuilder.equal(root.get("columnName 2"), Filtervalue)); 

     TypedQuery<Date> query = entityManager.createQuery(criteriaQuery); 
     Date date = query.getSingleResult(); 
Cuestiones relacionadas