こんにちは
最近なくしたパスモが飯能で見つかったが、取りに行くのを断念しました、桑原です
話の流れで、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






