2

我想做范围查询,例如,

从用户 u 中选择 u.age,其中年龄在 10 到 20 之间。这 10 和 20 将是​​动态值。

我试过参数为,

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

这给了我错误。我在单词之间丢失了一些东西。谁能告诉我这是如何实现的?

4

2 回答 2

4

更优化的解决方案是使用休眠标准,而不是硬编码的 SQL 查询。您应该为您的 User 类声明一个 @Entity 注释,并创建与您的表的列相对应的私有字段。

假设您有一个带有 id、name 和 age 的 User 表。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从 User表中进行选择。然后,这些限制分别意味着age >= aage <= b。uniqueResult ()告诉 hibernate 我们期望一个结果,而需要投影来检索某个列(那里的投影意味着从 User 中选择年龄)。如果未指定投影,则标准将默认返回整个类,即select * from User

我知道这对于您需要的东西来说似乎有点太复杂了,但是使用与您的表和标准匹配的实体是正确的方法。

于 2012-04-09T13:31:10.680 回答
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);  
于 2012-04-08T17:19:23.020 回答