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