休眠范围查询

时间:2012-04-08 17:17:34

标签: hibernate range

我想做范围查询,如

从年龄介于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);  

这给了我错误。在言语之间我错过了一些东西。谁能告诉我这是如何实现的呢?

2 个答案:

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