2011-01-19 20 views
5

JPAを使用してEJBコンテナにアプリケーションを構築しました。 java.lang.IllegalArgumentException: The attribute [Username] from the managed type....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(); 
} 

私は、私は次のエラーを取得するWebサービスからこのメソッドを実行しようとするのか?私は問題があると思いますfrom.get("Username") ...
あなたはどう思いますか?それを修正する方法は?


編集: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; 
    } 
} 

答えて

10

、あなたは、エンティティのプロパティ名ではなく、カラム名を使用します。データベース列の名前は「Username」ですが、Workspaceオブジェクトのプロパティは大文字のUを使用しない「username」です。

3

あなたはメタモデルを使用してみましたか? (文字列内や建物のJPQL)あなたの基準のクエリを構築する

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

WSからユーザー名を取得できません。それはなぜです? –

+0

申し訳ありませんが、正しい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(); 
関連する問題