2012-07-26 122 views
4

我覺得這是一個愚蠢的問題,但我找不到答案。我有一個類如下:JPA標準查詢加載整個表

import java.io.Serializable; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.SequenceGenerator; 
import javax.persistence.Table; 

@Entity 
@Table(name="DEMO_VARIABLES") 
public class Variable implements Serializable 
{ 
    private static final long serialVersionUID = -1734898766626582592L; 

    @Id 
    @SequenceGenerator(name="VARIABLE_ID_GENERATOR", sequenceName="DEMO_VARIABLE_ID_SEQ", allocationSize=1) 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="VARIABLE_ID_GENERATOR") 
    @Column(name="VARIABLE_ID", unique=true, nullable=false, precision=22) 
    private long variableId; 

    @Column(name="VARIABLE_NAME", nullable=false, length=50) 
    private String variableName; 

    @Column(name="VARIABLE_VALUE", nullable=false, length=500) 
    private String variableValue; 

    public Variable() 
    { 

    } 

    public long getVariableId() 
    { 
     return variableId; 
    } 

    public void setVariableId(long variableId) 
    { 
     this.variableId = variableId; 
    } 

    public String getVariableName() 
    { 
     return variableName; 
    } 

    public void setVariableName(String variableName) 
    { 
     this.variableName = variableName; 
    } 

    public String getVariableValue() 
    { 
     return variableValue; 
    } 

    public void setVariableValue(String variableValue) 
    { 
     this.variableValue = variableValue; 
    } 
} 

現在我想要使用條件查詢加載整個表(即「選擇*從變量」)。我想更多地使用標準查詢來獲得代碼一致性。我雖然得到這個異常:

java.lang.IllegalStateException: No criteria query roots were specified 
    at org.hibernate.ejb.criteria.CriteriaQueryImpl.validate(CriteriaQueryImpl.java:303) 
    at org.hibernate.ejb.criteria.CriteriaQueryCompiler.compile(CriteriaQueryCompiler.java:145) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:437 

我使用的查詢是:

public List<Variable> loadAllVariables() 
{ 
    CriteriaBuilder builder = em.getCriteriaBuilder(); 
    CriteriaQuery<Variable> query = builder.createQuery(Variable.class); 

    return em.createQuery(query).getResultList(); 
} 

我知道,異常意味着它要這樣:

Root<Variable> variableRoot = query.from(Variable.class); 

但是,如果沒有一個謂語我不看不到如何將Root對象放入查詢中?

回答

16

運行它,我不知道,我才明白你的權利,但如果目標是選擇獲取列表所有可變實體,那麼下面的路要走:

public List<Variable> loadAllVariables() { 
    CriteriaBuilder builder = em.getCriteriaBuilder(); 
    CriteriaQuery<Variable> query = builder.createQuery(Variable.class); 
    Root<Variable> variableRoot = query.from(Variable.class); 
    query.select(variableRoot); 

    return em.createQuery(query).getResultList(); 
} 

不同的是,選擇使用。所有的實現都不會隱式地使用select的最後一次調用。在JPA 2.0規範,這是告知如下:

便攜式應用程序應該使用選擇或者多選方法來 指定查詢的選擇列表。不使用這些方法中的一個 的應用程序將不可移植。

+0

謝謝你的工作。我只是熟悉使用query.where()並給它一個基於根的Predicated。 query.select()是缺失的鏈接。 – Greg 2012-07-26 14:07:26

4

與查詢工作,它的根是非常簡單的:
首先獲得root您所描述的方法:

Root<Variable> variableRoot = query.from(Variable.class); 

之後,你一定要告訴查詢它應該與根做:選擇, 在這種情況下。

query.select(variableRoot); 

之後,您可以使用query.where(...)函數等進一步修改查詢。 當你完成,你準備好與你

return em.createQuery(query).getResultList(); 

更多信息在the Oracle tutorial