すべてのプロダクト
Search
ドキュメントセンター

Tablestore:Hibernate を使用して SQL ステートメントを実行することでデータをクエリする

最終更新日:Dec 28, 2024

Hibernate は、Java 環境向けのオブジェクト/リレーショナル マッピング (ORM) ソリューションです。Hibernate を使用して Tablestore の Java Database Connectivity (JDBC) ドライバーを使用することで、Tablestore にアクセスできます。

背景情報

Hibernate は、Java 環境向けのオブジェクト/リレーショナル マッピング (ORM) ソリューションです。Hibernate を使用すると、Java クラスをデータベース テーブルにマッピングし、Java データ型を SQL データ型にマッピングし、データをクエリできます。Hibernate は、SQL と JDBC で手動でデータを処理するのに費やされる開発時間を大幅に短縮できます。詳細については、Hibernate のドキュメントを参照してください。

注意事項

SQL クエリ機能は、中国 (杭州)、中国 (上海)、中国 (北京)、中国 (張家口)、中国 (ウランチャブ)、中国 (深セン)、中国 (成都)、中国 (香港)、日本 (東京)、シンガポール、マレーシア (クアラルンプール)、英国 (ロンドン)、米国 (シリコンバレー)、インドネシア (ジャカルタ)、ドイツ (フランクフルト)、SAU (リヤド - パートナーリージョン)、および米国 (バージニア) の各リージョンでご利用いただけます。

前提条件

手順

ステップ 1: JDBC ドライバーをインストールする

JDBC ドライバーは、次のいずれかの方法でインストールできます。

  • Tablestore の JDBC ドライバーをダウンロードし、プロジェクトにインポートします。ダウンロードパスについては、Tablestore の JDBC ドライバーを参照してください。

  • Maven プロジェクトに依存関係を追加します。

    Maven で Tablestore の JDBC ドライバーを使用するには、対応する依存関係を pom.xml ファイルに追加するだけです。この例では、JDBC ドライバー 5.17.0 を使用しています。<dependencies> に次のコンテンツを追加します。

    <dependency>  <groupId>com.aliyun.openservices</groupId>  <artifactId>tablestore-jdbc</artifactId>  <version>5.17.0</version></dependency>

ステップ 2: Hibernate をインストールする

Hibernate は、次のいずれかの方法でインストールできます。

  • Hibernate インストールパッケージ hibernate-core-x.x.x.jar をダウンロードし、プロジェクトにインポートします。ダウンロードパスについては、Hibernate インストールパッケージを参照してください。

    hibernate-core-x.x.x.jar では、x.x.x は Hibernate のバージョン番号を示します。ビジネス要件に基づいて Hibernate インストールパッケージをダウンロードしてください。

  • Maven プロジェクトに依存関係を追加します。

    Maven で Hibernate を使用するには、対応する依存関係を pom.xml ファイルに追加するだけです。この例では、3.6.3.Final バージョンを使用しています。<dependencies> に次のコンテンツを追加します。

    <dependency>    <groupId>org.hibernate</groupId>    <artifactId>hibernate-core</artifactId>    <version>3.6.3.Final</version></dependency>

ステップ 3: SQL フィールドをマッピングする

データテーブルのフィールド名と同じ名前のメンバー変数を含む Java Bean を作成した後、マッピング設定ファイルを作成して、Java Bean のメンバー変数をデータテーブルのフィールドにマッピングします。

  1. データテーブルのフィールド名と同じ名前のメンバー変数を含む Java Bean を作成します。

    package hibernate;public class Trip {    private long tripId;    private long duration;    private String startDate;    private String endDate;    private long startStationNumber;    private long endStationNumber;    private String startStation;    private String endStation;    private String bikeNumber;    private String memberType;        // フィールド名を指定し、フィールド値を返すために使用されるメソッドを追加します。    // この例では、tripId フィールドを使用しています。ビジネス要件に基づいて、他のフィールドのフィールド名を指定し、フィールド値を返すために使用されるメソッドを同様の方法で追加できます。    public void setTripId(Long tripId){        this.tripId =tripId    }    public Long getTripId() {        return tripId;    }}
  2. マッピング設定ファイルを作成して、Java Bean のメンバー変数をデータテーブルのフィールドにマッピングします。次のサンプルコードは、hibernate ディレクトリに Trip.hbm.xml という名前のマッピング設定ファイルを作成する方法を示しています。

    重要

    Tablestore SQL はデータの挿入と更新をサポートしていません。したがって、insert プロパティと update プロパティを false に設定する必要があります。SQL でサポートされているデータ型の詳細については、SQL でのデータ型マッピングを参照してください。サポートされている SQL 機能の詳細については、SQL 機能を参照してください。

    <?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC        "-//Hibernate/Hibernate Mapping DTD//EN"        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping>    <!--実際のクラス名を指定します。-->    <class name="hibernate.Trip" table="trips">        <!--id 要素で設定されているフィールドは、データテーブルのプライマリキー列です。-->        <id name="tripId" column="trip_id" type="long"/>        <!--property 要素で設定されているフィールドは、データテーブルの属性列です。属性列では挿入操作と更新操作が禁止されているため、insert プロパティと update プロパティを false に設定する必要があります。-->        <property name="duration" column="duration" type="long" insert="false" update="false"/>        <property name="startDate" column="start_date" type="string" insert="false" update="false"/>        <property name="endDate" column="end_date" type="string" insert="false" update="false"/>        <property name="startStationNumber" column="start_station_number" type="long" insert="false" update="false"/>        <property name="endStationNumber" column="end_station_number" type="long" insert="false" update="false"/>        <property name="startStation" column="start_station" type="string" insert="false" update="false"/>        <property name="endStation" column="end_station" type="string" insert="false" update="false"/>        <property name="bikeNumber" column="bike_number" type="string" insert="false" update="false"/>        <property name="memberType" column="member_type" type="string" insert="false" update="false"/>    </class></hibernate-mapping>

ステップ 4: SessionFactory をビルドする

Hibernate 設定ファイルを構成した後、Hibernate 設定ファイルをロードして SessionFactory をビルドします。

  1. hibernate.cfg.xml という名前の Hibernate 設定ファイルに次のコンテンツを追加します。ビジネス要件に基づいて、設定ファイルの設定項目を変更します。

    <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration>    <session-factory>        <property name="hibernate.connection.driver_class">com.alicloud.openservices.tablestore.jdbc.OTSDriver</property>        <property name="hibernate.connection.url">jdbc:ots:https://myinstance.cn-hangzhou.ots.aliyuncs.com/myinstance</property>        <property name="hibernate.connection.username">************************</property>        <property name="hibernate.connection.password">********************************</property>        <property name="hibernate.connection.autocommit">true</property>        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>        <!--マッピング設定ファイルのパスを指定します。-->        <mapping resource="hibernate/Trip.hbm.xml"/>    </session-factory></hibernate-configuration>

    次の表は、Hibernate 設定ファイルで設定する必要がある項目について説明しています。

    設定項目

    タイプ

    必須

    説明

    hibernate.connection.driver_class

    class

    はい

    com.alicloud.openservices.tablestore.jdbc.OTSDriver

    Tablestore の JDBC ドライバーのクラス名。この設定項目を com.alicloud.openservices.tablestore.jdbc.OTSDriver に設定します。

    hibernate.connection.url

    string

    はい

    jdbc:ots:https://myinstance.cn-hangzhou.ots.aliyuncs.com/myinstance

    インスタンスのエンドポイント。値は jdbc:ots:endpoint/instanceName の形式である必要があります。endpoint はインスタンスのエンドポイントを示します。詳細については、エンドポイントを参照してください。instanceName はインスタンスの名前を示します。instanceName を実際のインスタンス名に置き換えます。

    この設定項目の値を指定する場合、値に jdbc:ots: プレフィックスを含める必要があります。

    hibernate.connection.username

    string

    はい

    ************************

    Alibaba Cloud アカウントまたは RAM ユーザーのアクセスキー ID。

    hibernate.connection.password

    string

    はい

    ********************************

    Alibaba Cloud アカウントまたは RAM ユーザーのアクセスキーシークレット。

    hibernate.connection.autocommit

    boolean

    はい

    true

    設定を自動的にコミットするかどうかを指定します。

    重要

    Tablestore はトランザクションをサポートしていません。hibernate.connection.autocommit を true に設定します。

    hibernate.dialect

    string

    はい

    org.hibernate.dialect.MySQLDialect

    Tablestore SQL は MySQL 構文を継承しています。この設定項目を org.hibernate.dialect.MySQLDialect に設定します。

  2. Hibernate 設定ファイルをロードして SessionFactory をビルドします。

    SessionFactory factory = new Configuration().  configure("hibernate/hibernate.cfg.xml").  buildSessionFactory();

ステップ 5: セッションを作成してデータをクエリする

Session session = factory.openSession();Trip trip = (Trip) session.get(Trip.class, 99L); System.out.println("trip id: " + trip.getTripId());System.out.println("start date: " + trip.getStartDate());System.out.println("end date: " + trip.getEndDate());System.out.println("duration: " + trip.getDuration());session.close();factory.close();

完全なサンプルコード

次のサンプルコードは、プライマリキー列の値が 99 である行をクエリし、その行の指定された列を返す方法を示しています。

import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import hibernate.Trip;public class HibernateDemo {    public static void main(String[] args) {        SessionFactory factory = new Configuration().                configure("hibernate/hibernate.cfg.xml"). // Hibernate 設定ファイルのフルパスを指定します。                buildSessionFactory();        Session session = factory.openSession();        // プライマリキー列の値を 99 に設定します。プライマリキー列の値が 99 である行が存在しない場合、null が返されます。        Trip trip = (Trip) session.get(Trip.class, 99L);        // 取得する列の値を表示します。        System.out.println("trip id: " + trip.getTripId());        System.out.println("start date: " + trip.getStartDate());        System.out.println("end date: " + trip.getEndDate());        System.out.println("duration: " + trip.getDuration());        session.close();        factory.close();    }}           

FAQ

Hibernate を使用して JDBC ドライバーを使用してデータをクエリするときに、次のエラーメッセージが表示された場合はどうすればよいですか?

  • 問題の説明

    Hibernate を使用して JDBC ドライバーを使用してデータをクエリすると、次のエラーメッセージが表示されます。

    Exception in thread "main" org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]  at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:108)  at org.hibernate.tuple.entity.EntityTuplizerFactory.constructDefaultTuplizer(EntityTuplizerFactory.java:133)  at org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping.<init>(EntityEntityModeToTuplizerMapping.java:80)  at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:322)  at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:485)  at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:133)  at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:84)  at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:286)  .....
  • 考えられる原因

    javassist-x.x.x.jar パッケージがありません。

  • 解決策

    次のいずれかの方法で javassist-x.x.x.jar パッケージをインストールします。

    • javassist インストールパッケージ javassist-x.x.x.jar をダウンロードし、プロジェクトにインポートします。ダウンロードパスについては、javassist インストールパッケージを参照してください。

      javassist-x.x.x.jar では、x.x.x は javassist のバージョン番号を示します。ビジネス要件に基づいて javassist インストールパッケージをダウンロードしてください。

    • Maven プロジェクトに依存関係を追加します。

      Maven プロジェクトの pom.xml ファイルに対応する依存関係を追加します。この例では、3.15.0-GA バージョンを使用しています。<dependencies> に次のコンテンツを追加します。

      <!-- https://mvnrepository.com/artifact/org.javassist/javassist --><dependency>    <groupId>org.javassist</groupId>    <artifactId>javassist</artifactId>    <version>3.15.0-GA</version></dependency>

Hibernate を使用して JDBC ドライバーを使用してデータをクエリするときに、Message: Unknown column '{columnName}' in 'field list' エラーメッセージが表示された場合はどうすればよいですか?

  • 問題の説明

    Hibernate を使用して JDBC ドライバーを使用してデータをクエリすると、Message: Unknown column '{columnName}' in 'field list' エラーメッセージが表示されます。

  • 考えられる原因

    指定された列が SQL マッピングテーブルに存在しません。

  • 解決策

    指定された列が SQL マッピングテーブルに存在することを確認します。次のいずれかの方法を使用してエラーを修正できます。

    • 指定された列を事前定義された列に追加して、指定された列を SQL マッピングテーブルに自動的に同期します。

    • CREATE TABLE ステートメントを実行してマッピングテーブルを作成するときに、列を指定します。詳細については、テーブルのマッピングテーブルを作成するを参照してください。

    • ALTER TABLE ステートメントを実行して、既存のマッピングテーブルの属性列を追加または削除します。詳細については、マッピングテーブルの属性列を更新するを参照してください。

関連情報