LoginSignup
4
4

More than 5 years have passed since last update.

Java8でJPAでHibernateでJinqを使うメモ

Posted at

依存関係はこんな感じに設定しました。

<dependencies>
  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.3.8.Final</version>
  </dependency>
  <dependency>
    <groupId>org.hibernate.javax.persistence</groupId>
    <artifactId>hibernate-jpa-2.1-api</artifactId>
    <version>1.0.0.Final</version>
  </dependency>
  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-c3p0</artifactId>
    <version>4.3.8.Final</version>
  </dependency>
  <dependency>
    <groupId>org.mariadb.jdbc</groupId>
    <artifactId>mariadb-java-client</artifactId>
    <version>1.1.8</version>
  </dependency>
  <dependency>
    <groupId>org.jinq</groupId>
    <artifactId>jinq-jpa</artifactId>
    <version>1.6</version>
  </dependency>
</dependencies>

Database定義はこんな感じです。MariaDBを使いました。
2.png

IDEAからAdd Framework Supportを選び
3.png

Hibernateを選択
4.png

Import database schemaにチェックを入れておけばDBからのScaffoldingウィザードが立ち上がります。
5.png
この例ではmodes以下にDBのテーブル定義から作成されたentityクラスが作成されます。

6.png

resources\META-INF ディレクトリが無ければ作成し、persistence.xmlを作成します。

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">

    <persistence-unit name="samplePersistenceUnit" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <class>com.company.models.CustomerEntity</class>
        <properties>
            <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/sample"/>
            <property name="hibernate.connection.driver_class" value="org.mariadb.jdbc.Driver"/>
            <property name="hibernate.connection.username" value="sample"/>
            <property name="hibernate.connection.password" value="sample"/>
            <property name="hibernate.archive.autodetection" value="class"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
            <property name="hibernate.c3p0.min_size" value="5" />
            <property name="hibernate.c3p0.max_size" value="20" />
            <property name="hibernate.c3p0.timeout" value="500" />
            <property name="hibernate.c3p0.max_statements" value="50" />
            <property name="hibernate.c3p0.idle_test_period" value="2000" />

            <!--
            <property name="hbm2ddl.auto" value="update"/>
            -->
        </properties>
    </persistence-unit>
</persistence>

動作確認。起動メソッドからSelectを試してみます。
最初のsetPersistenceProviderResolverは、書いておかないとHibernateがWarningを吐きやがります。

public class Main {

    public static void main(String[] args) {
        // http://stackoverflow.com/questions/27332066/hibernate-warning-about-persistenceprovider-occurs-even-if-correct-provider-is-g
        PersistenceProviderResolverHolder.setPersistenceProviderResolver(
                new PersistenceProviderResolver() {
                    private final List<PersistenceProvider> providers_ = asList((PersistenceProvider) new HibernatePersistenceProvider());

                    @Override
                    public List<PersistenceProvider> getPersistenceProviders() {
                        return providers_;
                    }

                    @Override
                    public void clearCachedProviders() {
                    }
                });



        EntityManagerFactory factory = Persistence.createEntityManagerFactory("samplePersistenceUnit");
        EntityManager manager = factory.createEntityManager();
        JinqJPAStreamProvider provider = new JinqJPAStreamProvider(manager.getMetamodel());
        JPAJinqStream<CustomerEntity> stream = provider.streamAll(manager, CustomerEntity.class)
                .where(c -> c.getId() > 0 && c.getStatus().equals("0"));

        List<CustomerEntity> list = stream.toList();

    }
}

普通にラムダでクエリのWhere条件が記述できました。
ただ、ASTからクエリを生成するところにハマりポイントが多いので、正直Jinqはまだ実用レベルでは無いというのが正直な所。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4