データベース: 条件とネイティブ SQL クエリ

1 基準クエリ

       

強力な HQL クエリを提供するだけでなく、Hibernate は Criteria と呼ばれるクエリ メソッドも提供します。HQL は SQL と非常によく似ており、柔軟性と豊富な機能が特徴ですが、欠点は、ユーザーが SQL の構文に精通している必要があることと、条件付きクエリを組み合わせるときに、Where 条件を組み立ててパラメーターを提供する必要があることが多いことです。条件。Criteria クエリは、よりオブジェクト指向であり、Java コードとの組み合わせが優れており、条件付きクエリを組み合わせるとより便利になることがよくあります。もちろんCriteriaにもデメリットはありますが、HQLほど可読性が高くなく、機能もHQLほど多くありません。

        Hibernate の関係者は、HQL を使用して問題を解決することを推奨することがよくあります。

1.1基準の使用方法.

 

Criteria criteria = sess.createCriteria(Category.class); //永続クラスのクエリ オブジェクトCriteriaを作成します

        criteria.add( rule ); //クエリ ルールの条件を設定します

        List list = query.list(); //クエリ結果を取得

 1.2ルール - 基準

Criterion は Criteria のクエリ条件です。Criteria は、クエリ条件を追加するための add(Criterion criteria) メソッドを提供します。Criterion インターフェイスの主な実装には、Example、Junction、および SimpleExpression が含まれます。Junction の実際の用途は、AND 演算子と OR 演算子を使用してそれぞれクエリ条件セットを結合する 2 つのサブクラス、結合と分離です。

Criterion インスタンスは、Restrictions ファクトリ クラスを介して提供できます。Restrictions は、Criterion クエリ条件を作成するために、eq (等しい)、ge (以上)、 between などの多数の静的メソッドを提供します。

(SimpleExpression インスタンス)。さらに、Restrictions は、結合および結合を作成するメソッドも提供します。

Disjunction インスタンス。インスタンスに (Criteria) メソッドを追加することにより、一連のクエリ条件を形成するクエリ条件を追加します。

制限事項の静的メソッド条件

意味

基準

HQL

同等

制限.eq()

=

等しくない

Restrictions.not(Exprission.eq())

<>

以上

制限.gt()

>

以上

制限.ge()

>=

未満

制限.lt()

<

以下

制限事項.the()

<=

空に等しい

制限.isnull()

無効である

空でない

制限.isNotNull()

null ではない

あいまいクエリ

制限.like()

好き

ロジックと

制限.and()

ロジックと

制限.conjunction()

論理的または

制限.or()

また

論理的または

制限.disjunction()

また

論理否定

制限.not()

いいえ

特定の値に等しい

制限.in()

の( )

どの値とも等しくない

Restrictions.not(Restrictions.in())

ありませんで()

間隔

制限. between()

x と y の間

範囲外

Restrictions.not(制限.. between())

x と y の間にない

(1)Criteriaに単純型属性制限(クエリ条件)を追加。

        基準基準 = sess.createCriteria(Movie.class);

        criteria.add(Restrictions.like("title", "%%"));

        List<ムービー> list = criteria.list();

(2) Criteria にアソシエーション クラスの属性制限を追加します。

        基準の add() メソッドを直接使用すると、関連付けられたクラスの単純な型属性の制限と Id 属性の制限のみを追加できます。関連付けられたクラスのその他の属性制限を追加する場合 (ムービー エンティティの関連付けられたクラス カテゴリの名前属性制限を追加するなど)、re-createCriteria() を作成して関連付けられた属性名をパラメータとして渡し、次に関連するクラス Category の属性を制限条件として使用できます。

        基準基準 = sess.createCriteria(Movie.class);

        criteria = criteria.createCriteria("category");                   // createCriteria()を再実行します

        criteria.add(Restrictions.eq("name","动漫"));

        List<ムービー> list = criteria.list();

        上記の効果は、条件の createAlias() メソッドによっても実現できます. createCriteria とは異なり、関連付けられたエンティティにエイリアスを与えるだけです. createAlias を使用した後でも、クエリされたオブジェクトの他の属性を制限として使用できます.

        List<Movie> list = sess.createCriteria(Movie.class)

                                                  .createAlias("カテゴリ", "c")

                                                  .add(Restrictions.eq("c.name", "战争"))

                                                  .add(Restrictions.like("title", "%"))

                                                  。リスト();

 1.3エンティティを使用して、同等または類似の規則に対する複数の制限を一度に宣言する - 例

例は、Criteria ルールを追加する方法でもあります.この方法では、クエリ エンティティ クラスのオブジェクトを使用して、複数のルールを一度に宣言します。Example の作成は異なります. Example 自体は静的メソッド create(Object entity) を提供し、パラメーターは作成するエンティティ オブジェクト (通常は実際に使用されるマッピングされたエンティティ オブジェクト) です。次に、いくつかのフィルター条件を設定できます。

        例 例 = Example.create(エンティティ)

                                                           .ignoreCase() //大文字と小文字を区別しない

                                                           .enableLike(MatchMode.ANYWHERE);  //使用like

        基準.追加(例);

        リスト list = criteria.list()

1.4 ソートの実装 

Criteria の addOrder(Order order) を使用して、クエリ結果の順序を制御できます。Order オブジェクトのインスタンスは、Order.asc("プロパティ名") および Order.desc("プロパティ名") を通じて取得できます。

        猫のリスト = sess.createCriteria(Cat.class)

                                  .add( Restrictions.like("name", "F%")

                                  .addOrder( Order.asc("名前") )

                                  .addOrder( Order.desc("年齢") )

                                  .list() ;

1.5 ページネーションを実現する

Criteria オブジェクトは、Query オブジェクトと同様に、setFirstResult() および setMaxResults() メソッドを介してページネーションを実装できます。

1.6 射影 射影 — 集計関数とグループ化の実装

Criteria は、 setProjection(Projection projection) メソッドを介して集計統計とグループ化を実装できます。

プロジェクションは、主に Criteria が統計クエリを実行し、グループ化を実現できるようにします。プロジェクションは、主に SimpleProjection と ProjectionList によって実現されます。SimpleProjection と ProjectionList の作成は、提供されている avg()、count()、max()、min()、sum() などの Projections の組み込み静的メソッドを介して行われ、開発者は簡単に特定のフィールド 統計クエリを実行します。Projections の groupProperty() メソッドは、結果をグループ化することもできます。

        ProjectionList projectList = Projections.projectionList();

        投影 prjCount = Projections.count("id");

        プロジェクションリスト.add(prjCount);

        projectList.add(Projections.groupProperty("カテゴリ"));

        criteria.setProjection(projectionList);

        List<Object[]> list = criteria.list();

1.7 DetachedCriteria 

DetachedCriteria クラスは Criteria インターフェイスに似ています. 上記のメソッド (Criterion と Projection) を使用してクエリ条件を設定できますが、この 2 つの作成方法は異なります: Criteria は Session オブジェクトによって作成される必要があり、 DetachedCriteria は、作成時に Session オブジェクトを必要としません。したがって、DetachedCriteria は Session スコープの外で構築でき、一連の複雑な条件を追加して、実行のために Session 環境で Dao メソッドに渡すことができます。DetachedCriteria の登場により、「条件構築」と「クエリ実行」の分離が実現します。

public static void main(String[] args) {
		DetachedCriteria cri = DetachedCriteria.forClass(Movie.class);
		cri.add(Restrictions.eq("category.id", 1));
		List<Movie> list = get(cri);
		for(Movie m: list){
			System.out.println(m.getTitle()+","+m.getCategory().getName());
		}
	}
	static List get(DetachedCriteria cri){
		Session sess = null;
		try {
			sess = HibernateUtil.getSession();	
			return cri.getExecutableCriteria(sess).list();
		} finally {
			if(sess!=null)
				sess.close();
		}
	}

2ネイティブSQL操作 

2.1ネイティブSQLクエリ

HQL は十分に強力ですが、データベース システムごとに標準 SQL に対する拡張機能が異なるため (SQL Server の T-SQL、Oracle の PL/SQL、Hibernate のダイアレクト「Dialect」など)、HQL を 100% 完成させることはできません。ネイティブ SQL で実現できます。さらに、HQL は最終的に SQL に変換して実行する必要があります.この自動変換は常に不十分であり、過度に複雑な HQL を SQL に変換した後は、実行効率が低下する可能性があります. このため、Hibernate はデータベースのローカル SQL を直接使用する権利も留保し、SQL ステートメントを直接記述してクエリ結果を制御できます。ネイティブ SQL を使用した後、将来データ アクセス レイヤーを別のデータベース システムに切り替える場合は、これらのネイティブ SQL を新しいデータベースの方言に準拠するように変更する必要があることに注意してください。

(1) プリミティブ型 Object の配列を返すネイティブ SQL クエリ。

ローカル SQL クエリと HQL クエリの使用法は基本的に似ています。違いは、SQL クエリはセッションの createSQLQuery(String sql) メソッドを使用する必要があり、返されるクエリ オブジェクトは SQLQuery 型であるということです。

String sql = "select m.Title, c.name from Movie m 内部結合カテゴリ c on m.CategoryId=c.Id where c.name=:cname";

SQLQuery クエリ = sess.createSQLQuery(sql);

query.setString("cname", "戦争");

List<Object[]> list = query.list();

(2) マップされたエンティティを直接返すネイティブ SQL クエリ。

ローカル SQL クエリを介して永続的なエンティティ オブジェクトを返したい場合がよくあります. 上記の方法を使用した場合, Hibernate によって返される結果は Object の基本型の配列です. エンティティを取得するには, エンティティ オブジェクトを再構築してプロパティを設定する必要があります. 作業を簡素化するために、SQLQuery インターフェイス オブジェクトは addEntity(String alias, Class entityClass) メソッドを直接提供します。これにより、SQL の結果をエンティティ オブジェクトに直接入力し、エンティティ オブジェクトの配列とリストを返すことができます。

String sql = "select m.*, c.* from Movie m inner join Category c on m.CategoryId=c.Id where c.name=:cname";
SQLQuery query = sess.createSQLQuery(sql);
query.addEntity("m",Movie.class);
query.addEntity("c",Category.class);
query.setString("cname", "战争");
List<Object[]> list = query.list();
for(Object[] arr : list){
        Category c = (Category)arr[1];
        Movie m = (Movie)arr[0];
        System.out.println( c.getName() + "," + m.getTitle());
}

2.2ネイティブJDBC操作 

ネイティブ JDBC を使用してより柔軟に追加、削除、および変更する場合は、Session オブジェクトによって提供される doWork メソッドを使用して、Work インターフェイスを介して内部匿名クラスを記述し、JDBC の基になる API を呼び出してバッチを実装できます。オペレーション。

以下に示すように、Session.doWork() メソッドが実行されます。

Session session=HibernateUtil.openSession();
	Transaction transaction=session.beginTransaction();
	session.doWork(new Work() {
			public void execute(Connection conn) throws SQLException {
				//这里是SQL非HQL
				String sql = "delete from Movie where categoryId=?"; 
				PreparedStatement stmt = conn.prepareStatement(sql);
				stmt.setInt(1, 2);
				stmt.executeUpdate();
			}
	});
	transaction.commit();

おすすめ

転載: blog.csdn.net/qq_55917018/article/details/128237954