JPA条件查询加载整个表
我觉得这是个愚蠢的问题,但我找不到答案。我的课程如下:JPA条件查询加载整个表,jpa,criteria-api,Jpa,Criteria Api,我觉得这是个愚蠢的问题,但我找不到答案。我的课程如下: 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.pe
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();
}
public List loadAllVariables()
{
CriteriaBuilder=em.getCriteriaBuilder();
CriteriaQuery=builder.createQuery(Variable.class);
返回em.createQuery(query.getResultList();
}
我知道例外情况意味着它希望:
Root<Variable> variableRoot = query.from(Variable.class);
Root variableRoot=query.from(Variable.class);
但是如果没有谓词,我看不到如何将根对象放入查询中?处理查询,它的根非常简单:
首先按照您描述的方式获取根:
Root<Variable> variableRoot = query.from(Variable.class);
之后,您可以使用query.where(…)
函数等进一步修改查询。
完成后,您就可以使用
return em.createQuery(query).getResultList();
更多信息,我不确定,我对你们的理解是否正确,但若目标是选择获取所有可变实体的列表,那个么接下来的工作就是:
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();
}
public List loadAllVariables(){
CriteriaBuilder=em.getCriteriaBuilder();
CriteriaQuery=builder.createQuery(Variable.class);
Root variableRoot=query.from(Variable.class);
query.select(variableRoot);
返回em.createQuery(query.getResultList();
}
不同之处在于使用了select。并非所有实现都隐式地使用from的最后一次调用来代替select。在JPA 2.0规范中,说明如下:
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或multiselect方法
指定查询的选择列表。不使用一个应用程序的应用程序
这些方法中的任何一种都是不可移植的
谢谢,这很有效。我只熟悉使用query.where()并基于根给它一个谓词。query.select()是缺少的链接。