2011-01-19 3 views
5

J'ai construit une application en utilisant JPA dans un conteneur EJB. Voici mon codeLangage de requête 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(); 
} 

Lorsque je tente de lancer cette méthode à partir d'un webservice je reçois l'erreur suivante: java.lang.IllegalArgumentException: The attribute [Username] from the managed type....

Quel peut être le problème? Je pense que j'ai un problème avec from.get("Username") ...
Que pensez-vous? Et comment le réparer?


Edit: 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; 
    } 
} 

Répondre

10

Lors de la construction de votre requête critères (ou d'un bâtiment JPQL dans une chaîne), vous souhaitez utiliser les noms de propriétés de l'entité, et non pas les noms de colonnes. Votre colonne de base de données est nommée « Nom d'utilisateur », mais la propriété de l'objet de l'espace de travail est « nom d'utilisateur » sans la capitale U.

3

Avez-vous essayé d'utiliser métamodèle?

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

Je ne peux pas obtenir le nom d'utilisateur de WS. Pourquoi est-ce? –

+0

désolé, raté correct page 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(); 
Questions connexes