2

のような範囲クエリを実行したい

年齢が 10 歳から 20 歳のユーザー u から u.age を選択します。これらの 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、名前、年齢を持つ 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 >= aおよびage <= bを意味します。uniqueResult()は、特定の列を取得するためにプロジェクションが必要である一方で、1 つの結果が期待されることを 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 に答える