2011-01-19 16 views
5

Zbudowałem aplikację, używając JPA w kontenerze EJB. Oto mój kodKryteria języka zapytań JPABuilder

@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(); 
} 

Kiedy próbuję uruchomić tę metodę z usługa pojawia się następujący błąd: java.lang.IllegalArgumentException: The attribute [Username] from the managed type....

Co może być problemem? Myślę, że mam problem z from.get("Username") ...
Co myślisz? I jak to naprawić?


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

Odpowiedz

10

Budując swoje kryteria zapytań (lub budowę JPQL na sznurku), którego chcesz użyć nazwy własności podmiot, a nie nazw kolumn. Twoja kolumna bazy danych ma nazwę "Nazwa użytkownika", ale właściwość obiektu Workspace to "nazwa użytkownika" bez kapitału U.

3

Czy próbowałeś za pomocą metamodel?

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

Nie mogę uzyskać nazwy użytkownika od WS. Dlaczego to jest? –

+0

Przepraszam, ominąłem poprawną stronę dokumentu 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(); 
Powiązane problemy