8

これはばかげた質問だと思いますが、答えが見つかりません。次のようなクラスがあります。

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

ここで、条件クエリを使用してテーブル全体をロードします (つまり、「select * from variables」)。私は何よりもコードの一貫性のために条件クエリを使用したいと考えています。ただし、この例外が発生します。

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

しかし、述語がないと、ルート オブジェクトをクエリに取得する方法がわかりません。

4

2 に答える 2

29

よくわかりませんが、すべての変数エンティティの取得リストを選択することが目標である場合は、次のようになります。

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 の代わりに from の最後の呼び出しを暗黙的に使用するわけではありません。JPA 2.0仕様では、これは次のように伝えられています。

ポータブル アプリケーションでは、select または multiselect メソッドを使用して、クエリの選択リストを指定する必要があります。これらの方法のいずれも使用しないアプリケーションは移植できません。

于 2012-07-26T13:32:39.630 に答える
7

クエリとそのルートの操作は非常に簡単です。
最初に、説明した方法でルートを取得します。

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

その後、ルートで何をすべきかをクエリに伝える必要があります。この場合は select です。

query.select(variableRoot);

その後、query.where(...)関数などを使用してクエリをさらに変更できます。終了したら、それを実行する準備が整いました

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

詳細については、Oracle チュートリアルを参照してください。

于 2012-07-26T13:32:23.153 に答える