2012-04-08 9 views
2
私のような範囲のクエリを実行したい

、10およびこれらの10 20と20の間に年齢は動的な値になるユーザuから休止範囲クエリ

選択u.age。

これは私にエラーを与えている

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

ure missing ":aとbの前に、" u.age "は年齢ではなく。このタイプミスですか?もしそうなら、 'u.age from user.u.age.aと:b'の間でu.ageを選択してみてください。 – kommradHomer

答えて

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

ハードコードされたSQLクエリではなく、より最適なソリューションは、休止状態のCriteriaを使用しています。 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; 
} 

注:Userクラスは、次にようになります。データベーステーブル内の列があなたのフィールドとして正確同じ名前を持っている場合、@Column(名=「..」)注釈が必要ではありません。

次に、年齢を取得することになります:Userクラスによって基準を作成

int userAge = session.createCriteria(User.class) 
         .add(Restrictions.ge("age", a)) 
         .add(Restrictions.le("age", b)) 
         .setProjection(Property.forName("age")) 
         .uniqueResult(); 

ユーザーテーブルからを選択するために休止状態に伝えます。その後、制限はが意味するところ年齢> =年齢それぞれ< = B、。 uniqueResult()は、単一の結果を期待していることをhibernateに通知します。投影は特定の列を取得するために必要です(プロットはから選択を意味します)。投影が指定されていない場合は、デフォルトでクラス全体が返されます。select * from User

私はあなたが必要とするものには少し複雑すぎると思っていますが、あなたのテーブルに合ったエンティティとCriteriaを使って作業するのが正しい方法です。

+0

私はちょうどHibernateを学んでいます。なぜCriteriaはHQLより優れていますか? –

+0

「より良い」ということは、それがプログラム的に正しいアプローチであることを理解しています。ハードコーディングは決して良いソリューションではありません。たとえば、データベースが変更された場合を考えてください(たとえば、テーブルによっては列名やテーブルの関係が変更されるなど)。 HQLを使用すると、すべてのDAOクラス(私はより大きなアプリケーションについて話しています)を入力し、新しいデータベースとその関係に一致するように各SQL呼び出しを変更することを意味します。基準を使用すると、対応するクラスを入力し、フィールドの名前変更(リファクタリング)を行うだけで済みます。これは単なる非常に基本的な例です。 –