ハマログ

株式会社イーツー・インフォの社員ブログ

hibernateで単純なSELECT文の順読み込み

こんにちは
最近なくしたパスモが飯能で見つかったが、取りに行くのを断念しました、桑原です

話の流れで、Javaでキーブレークを使った集計を実装しようと思い立ちました
hibernateで単純なSELECT文による順読み込みを行います
その読み込んだ結果を集計します

そこまでを目論でいましたが、hibernateの設定で四苦八苦し、
なんとか順読み込みできるところまでで、時間切れとなってしまいました

この記事では、その順読み込みのところまでのソースと、実行結果を
だらだらと下に貼り付けて終わりとさせて頂きました

次回は、これを基礎に集計処理に仕立て上げる予定です

次回
は、キーブレークを使った集計について説明します

この記事では次に記事を参考にさせて頂いています
ありがとうございます

Hibernateを使ってみる(Annotationを使って)

http://d.hatena.ne.jp/tanakakns/20120618/1340010699

log4jの設定ファイル(log4j.properties)の書き方

http://d.hatena.ne.jp/gungnir_odin/20130116/1358347663

順読み込みを行う対象のテーブルのDDLと見本データの登録文

create table URIAGE_CHOU (
ID          bigint          primary key not null auto_increment,
NENGETSU    varchar(6)      not null,
SHOUHIN     varchar(100)    not null,
GAKU        int             not null
);
insert URIAGE_CHOU (NENGETSU,SHOUHIN,GAKU) values ('201305', 'senbei', 30);
insert URIAGE_CHOU (NENGETSU,SHOUHIN,GAKU) values ('201305', 'monaka', 70);
insert URIAGE_CHOU (NENGETSU,SHOUHIN,GAKU) values ('201306', 'senbei', 30);
insert URIAGE_CHOU (NENGETSU,SHOUHIN,GAKU) values ('201306', 'senbei', 30);
insert URIAGE_CHOU (NENGETSU,SHOUHIN,GAKU) values ('201306', 'monaka', 70);

MySQL version: 5.5.28

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.example</groupId>
	<artifactId>exp1</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>exp1</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<repositories>
		<repository>
			<id>JBoss repository</id>
			<url>http://repository.jboss.com/maven2/</url>
		</repository>
	</repositories>

	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.4.2</version>
		</dependency>

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

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.27</version>
		</dependency>
	</dependencies>

</project>

hibernate.cfg.xml

<?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>

        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost/yourdbname?characterEncoding=UTF-8</property>
        <property name="connection.username">user</property>
        <property name="connection.password">password</property>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <mapping package="com.example.exp1" />
        <mapping class="com.example.exp1.UriageChou" />
    </session-factory>

</hibernate-configuration
>

log4j.properties

#---------------------------------------------------------------------------------------
# Logger
#---------------------------------------------------------------------------------------
# Root
log4j.rootLogger=INFO, ROOT

#---------------------------------------------------------------------------------------
# Appender
#---------------------------------------------------------------------------------------
# for Root
log4j.appender.ROOT=org.apache.log4j.ConsoleAppender
log4j.appender.ROOT.layout=org.apache.log4j.PatternLayout
log4j.appender.ROOT.layout.ConversionPattern=%-5p - %m%n

UriageChou.java

売上帳テーブルのレコードを表します。
このレコードを年月毎に集計する予定です。

package com.example.exp1;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "URIAGE_CHOU")
public class UriageChou {

    public UriageChou() {
    }
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID", unique = true, nullable = false)
    private long id;

    @Column(name = "NENGETSU", length = 6)
    private String  nengetsu;

    @Column(name = "SHOUHIN", length = 100)
    private String  shouhin;

    @Column(name = "GAKU")
    private Integer gaku;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getNengetsu() {
        return nengetsu;
    }

    public void setNengetsu(String nengetsu) {
        this.nengetsu = nengetsu;
    }

    public String getShouhin() {
        return shouhin;
    }

    public void setShouhin(String shouhin) {
        this.shouhin = shouhin;
    }

    public Integer getGaku() {
        return gaku;
    }

    public void setGaku(Integer gaku) {
        this.gaku = gaku;
    }
}

App.java

処理の開始点を持つクラス
とりあえずDBと接続して売上帳テーブルから順にレコードを読み、コンソールに表示しています。

package com.example.exp1;

import org.hibernate.ScrollMode;
import org.hibernate.ScrollableResults;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
 * Hello world!
 *
 */
public class App 
{
    private static SessionFactory buildSessionFactory() {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
            return new Configuration().configure().buildSessionFactory();
        }
        catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static void main( String[] args )
    {
        SessionFactory f = buildSessionFactory();
        Session ss = f.openSession();
        ss.beginTransaction();
        ScrollableResults rs = ss.createSQLQuery("select * from URIAGE_CHOU order by NENGETSU")
                .addEntity(UriageChou.class)
                .scroll(ScrollMode.FORWARD_ONLY)
                ;
        
        while(rs.next()) {
            UriageChou u = (UriageChou) rs.get(0);
            System.out.println(u.getShouhin());
        }
                
        ss.getTransaction().commit();
    }
}

実行結果

Hibernate: select * from URIAGE_CHOU order by NENGETSU
senbei
monaka
senbei
senbei
monaka
daodatabaseDBhibernateJavaデータベース

  桑原 光昭   2013年11月25日


関連記事

AWS環境で、EC-CUBEのtimezoneがおかしくなった話

~経緯~ 現在、案件でAWS環境でEC-CUEBの構築をしています。 テストで受…

最新のOracleドライバーをMaven2で管理する

古いJavaをバージョンアップしようと試みたところ、Oracleドライバが古く、…

ALBだけでメンテナンスページを表示する

ウェブサイトのメンテナンス時に表示するメンテナンスページをALBだけで表示する方…


← 前の投稿

次の投稿 →