我想做范围查询,如
从年龄介于10到20之间的用户u中选择u.age。这些10和20将是动态值。
我试过参数as,
a=10;
b=20;
Query q = session.createQuery("select u.age from user u where age between a and b");
q.setInteger("a",a);
q.setInteger("b",b);
这给了我错误。在言语之间我错过了一些东西。谁能告诉我这是如何实现的呢?
答案 0 :(得分:4)
更优化的解决方案是使用hibernate Criteria,而不是使用硬编码的SQL查询。您应该为User类声明一个@Entity注释,并创建与表的列对应的私有字段。
假设您有一个包含ID,名称和年龄的User表。用户类将如下所示:
@Entity
@Table(name = "User")
public class User{
private long id;
private String userName;
private int age;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(unique = true, nullable = false)
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name = "userName", nullable = false)
public String getUserName() {
return this.userName;
}
@Column(name = "age")
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return this.age;
}
注意:如果数据库表中的列具有完全与字段相同的名称,则不需要@Column(name =“..”)注释。
然后,检索年龄将是:
int userAge = session.createCriteria(User.class)
.add(Restrictions.ge("age", a))
.add(Restrictions.le("age", b))
.setProjection(Property.forName("age"))
.uniqueResult();
按User类创建条件告诉hibernate进行 select from User 表。然后,限制分别表示其中age> = a 和 age< = b 。 uniqueResult()告诉hibernate我们期望单个结果,而需要投影来检索某个列(这里的投影意味着从用户选择年龄)。如果未指定投影,则标准将默认返回整个班级,即 select * from User 。
我知道这对于你需要的东西来说似乎有点过于复杂,但是使用与你的桌子和Criteria相匹配的实体是正确的方法。
答案 1 :(得分:1)
您需要制作命名参数。
a=10;
b=20;
Query q = session.createQuery("select u.age from user u where age between :a and :b");
q.setInteger("a",a);
q.setInteger("b",b);