Hibernate/Exampleによるクエリ
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
#contents
Hibernatにはいろいろな検索機能がありますが「Exampleによる...
Item example = new Item();
example.setItemCode("C003"); <- アイテムコードのカラム...
List list = dao.findByExample(example); <-合致するモノを...
こんな感じです。アイテムコードが「C003」となっているレコ...
**準備 [#u9da7deb]
実際にやってみます。
***テーブルと対応するJavaBeans [#ma3a1802]
#ref(item.png)
-DDL
CREATE TABLE `ITEM` (
`ITEM_ID` int(10) unsigned NOT NULL auto_increment,
`ITEM_CODE` varchar(10) NOT NULL default '',
`NAME` varchar(256) NOT NULL default '',
`INITIAL_PRICE` double NOT NULL default '0',
`VERSION` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`ITEM_ID`)
);
-JavaBeans
package nu.mine.kino.entity.webdb1;
import org.apache.commons.lang.builder.ToStringBuilder;
public class Item implements java.io.Serializable {
private int itemId;
private int version;
private String itemCode;
private String name;
private double initialPrice;
public Item() {
}
public Item(int itemId, String itemCode, String name, ...
this.itemId = itemId;
this.itemCode = itemCode;
this.name = name;
this.initialPrice = initialPrice;
}
public Item(String itemCode, String name, double initi...
this.itemCode = itemCode;
this.name = name;
this.initialPrice = initialPrice;
}
public String toString() {
return new ToStringBuilder(this).append("id", getIte...
"code", getItemCode()).append("Name", getName())...
"price", getInitialPrice()).toString();
}
getter/setterは省略
}
-Item.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hiberna...
"http://hibernate.sourceforge.net/hibernate-mapping-3.0....
<!-- Generated 2006/09/24 21:45:30 by Hibernate Tools 3....
<hibernate-mapping>
<class name="nu.mine.kino.entity.webdb1.Item" table="I...
<id name="itemId" type="int">
<column name="ITEM_ID" />
<generator class="increment" />
</id>
<version name="version" type="int">
<column name="VERSION" not-null="true" />
</version>
<property name="itemCode" type="string">
<column name="ITEM_CODE" length="10" not-null="tru...
</property>
<property name="name" type="string">
<column name="NAME" length="256" not-null="true" />
</property>
<property name="initialPrice" type="double">
<column name="INITIAL_PRICE" precision="22" scale=...
</property>
</class>
</hibernate-mapping>
***DAO [#fe878fed]
-DAO (interface)
package nu.mine.kino.entity.webdb1;
import java.util.List;
public interface IItemDAO {
Item save(Item item);
void delete(Item item);
Item update(Item item);
Item findById(int id);
List findByExample(Item instance);
}
-DAOの実装(Powered by Spring)
package nu.mine.kino.entity.webdb1;
import org.apache.log4j.Logger;
import java.util.List;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Example;
import org.springframework.orm.hibernate3.support.Hibern...
/**
* @author Masatomi KINO
* @version $Revision$
* @spring.bean id = "itemDao"
* @spring.property name = "sessionFactory" ref = "sessi...
*/
public class ItemDAO extends HibernateDaoSupport impleme...
private static final Logger logger = Logger.getLogger(...
public List findByExample(Item instance) {
DetachedCriteria dc = DetachedCriteria.forClass(Item...
List results = getHibernateTemplate().findByCriteria...
return results;
}
.. その他の実装は省略
}
**やってみる [#e61da8fe]
DAOの単体テストクラスを作って、その中で実際に検索を行いま...
***データのセットアップ [#s32caa72]
tableには以下のようなデータが入っています。
|LEFT:ITEM_ID|LEFT:ITEM_CODE|LEFT:NAME|LEFT:INITIAL_PRICE...
|RIGHT:21|LEFT:C003|LEFT:商品21|RIGHT:505.5|RIGHT:0|
|RIGHT:23|LEFT:C003|LEFT:商品21_01|RIGHT:202.5|RIGHT:0|
|RIGHT:24|LEFT:C004|LEFT:商品22_01|RIGHT:302.8|RIGHT:0|
|RIGHT:25|LEFT:C003|LEFT:商品21_02|RIGHT:0|RIGHT:0|
***単体テストクラス [#lf8dbd33]
public class ItemDAOTestWithSpring extends
AbstractTransactionalDataSourceSpringContextTests {
public void testFindByExample() {
logger.debug("testFindByExample() - start");
Item example = new Item();
example.setItemCode("C003");
example.setInitialPrice(202.5);
List list = dao.findByExample(example);
logger.debug("結果は " + list.size() + " 件でした");
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Item element = (Item) iterator.next();
logger.debug(element);
}
logger.debug("testFindByExample() - end");
}
.....あとはいろいろ省略
}
***検索結果 [#b4e8b83a]
上の検索結果ですが、検索条件は「ITEM_CODE='C003' and INIT...
結果は 1 件でした
nu.mine.kino.entity.webdb1.Item@d5c0f9[id=23,code=C003,N...
となります。
**いろいろな検索条件 [#p51d792d]
***0を除く [#r103ab9f]
先の検索条件を
Item example = new Item();
example.setItemCode("C003");
// example.setInitialPrice(202.5);
List list = dao.findByExample(example);
と変更します。検索条件は「ITEM_CODE='C003'」ということで、
|LEFT:ITEM_ID|LEFT:ITEM_CODE|LEFT:NAME|LEFT:INITIAL_PRICE...
|RIGHT:21|LEFT:C003|LEFT:商品21|RIGHT:505.5|RIGHT:0|
|RIGHT:23|LEFT:C003|LEFT:商品21_01|RIGHT:202.5|RIGHT:0|
|RIGHT:25|LEFT:C003|LEFT:商品21_02|RIGHT:0|RIGHT:0|
がヒットしそうですが、検索結果は
|RIGHT:25|LEFT:C003|LEFT:商品21_02|RIGHT:0|RIGHT:0|
の1件のみになります。これはこのテーブルのINITIAL_PRICEの...
さて
Item example = new Item();
example.setItemCode("C003");
List list = dao.findByExample(example);
としたら「ITEM_CODE='C003'」のレコードがすべて返却される...
DetachedCriteria dc = DetachedCriteria.forClass(Item.cla...
List results = getHibernateTemplate().findByCriteria(dc);
return results;
を
DetachedCriteria dc = DetachedCriteria.forClass(Item.cla...
dc.add(Example.create(instance).excludeZeroes()); <-追加。
List results = getHibernateTemplate().findByCriteria(dc);
return results;
とします。この設定をしておくと、0とセットされたカラムを検...
結果は 3 件でした
nu.mine.kino.entity.webdb1.Item@d5c0f9[id=21,code=C003,N...
nu.mine.kino.entity.webdb1.Item@1701bdc[id=23,code=C003,...
nu.mine.kino.entity.webdb1.Item@1353249[id=25,code=C003,...
となりました。ただこれだと、ホントにデータが0のレコードを...
***あるカラムだけ検索条件から除く [#xdf118f4]
DAOで以下のように設定します。
DetachedCriteria dc = DetachedCriteria.forClass(Item.cla...
dc.add(Example.create(instance).excludeProperty("initial...
List results = getHibernateTemplate().findByCriteria(dc);
return results;
こうしておくと、initialPrice フィールドは検索条件から除外...
Item example = new Item();
example.setItemCode("C003");
example.setInitialPrice(100000.0); <-除外されたカラム
List list = dao.findByExample(example);
などとしても検索結果は
結果は 3 件でした
nu.mine.kino.entity.webdb1.Item@d5c0f9[id=21,code=C003,N...
nu.mine.kino.entity.webdb1.Item@1701bdc[id=23,code=C003,...
nu.mine.kino.entity.webdb1.Item@1353249[id=25,code=C003,...
となります。initialPriceは正しく小文字で始めないとダメみ...
***そもそも、識別子は除外される。 [#a20c4447]
キーやバージョンのプロパティなどは検索条件から除外される...
Item example = new Item();
example.setItemId(1); <-適当な値
example.setVersion(100); <-適当な値
example.setItemCode("C003");
List list = dao.findByExample(example);
としても3件ヒットしました。また、nullや''がセットされて...
***部分一致とか [#e58f454b]
次にNameカラムでいろいろ試してみます。DAOは
DetachedCriteria dc = DetachedCriteria.forClass(Item.cla...
dc.add(Example.create(instance).excludeZeroes());
List results = getHibernateTemplate().findByCriteria(dc);
とします。再掲ですがデータは
|LEFT:ITEM_ID|LEFT:ITEM_CODE|LEFT:NAME|LEFT:INITIAL_PRICE...
|RIGHT:21|LEFT:C003|LEFT:商品21|RIGHT:505.5|RIGHT:0|
|RIGHT:23|LEFT:C003|LEFT:商品21_01|RIGHT:202.5|RIGHT:0|
|RIGHT:24|LEFT:C004|LEFT:商品22_01|RIGHT:302.8|RIGHT:0|
|RIGHT:25|LEFT:C003|LEFT:商品21_02|RIGHT:0|RIGHT:0|
でした。
まずは完全一致から。
Item example = new Item();
example.setName("商品21");
List list = dao.findByExample(example);
と実行すると完全一致のため
|LEFT:ITEM_ID|LEFT:ITEM_CODE|LEFT:NAME|LEFT:INITIAL_PRICE...
|RIGHT:21|LEFT:C003|LEFT:商品21|RIGHT:505.5|RIGHT:0|
がヒットします。
結果は 1 件でした
nu.mine.kino.entity.webdb1.Item@1701bdc[id=21,code=C003,...
部分一致させるためにはDAO内で部分一致を有効にする必要があ...
DetachedCriteria dc = DetachedCriteria.forClass(Item.cla...
dc.add(Example.create(instance).excludeZeroes().enableLi...
List results = getHibernateTemplate().findByCriteria(dc);
検索側も
example.setName("商品21%");
とすることで部分一致検索となります。
結果は 3 件でした
nu.mine.kino.entity.webdb1.Item@1579a30[id=21,code=C003,...
nu.mine.kino.entity.webdb1.Item@4bfe6b[id=23,code=C003,N...
nu.mine.kino.entity.webdb1.Item@12c5431[id=25,code=C003,...
と検索結果は3件になりました。
**参考リンク [#c9cc61a2]
-[[Kodersのサンプル(QueryByExampleTest.java)>http://www.k...
-http://anonhibernate.labs.jboss.com/trunk/Hibernate3/doc...
----
この記事は
#vote(おもしろかった[6],そうでもない[3])
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}
終了行:
// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
#contents
Hibernatにはいろいろな検索機能がありますが「Exampleによる...
Item example = new Item();
example.setItemCode("C003"); <- アイテムコードのカラム...
List list = dao.findByExample(example); <-合致するモノを...
こんな感じです。アイテムコードが「C003」となっているレコ...
**準備 [#u9da7deb]
実際にやってみます。
***テーブルと対応するJavaBeans [#ma3a1802]
#ref(item.png)
-DDL
CREATE TABLE `ITEM` (
`ITEM_ID` int(10) unsigned NOT NULL auto_increment,
`ITEM_CODE` varchar(10) NOT NULL default '',
`NAME` varchar(256) NOT NULL default '',
`INITIAL_PRICE` double NOT NULL default '0',
`VERSION` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`ITEM_ID`)
);
-JavaBeans
package nu.mine.kino.entity.webdb1;
import org.apache.commons.lang.builder.ToStringBuilder;
public class Item implements java.io.Serializable {
private int itemId;
private int version;
private String itemCode;
private String name;
private double initialPrice;
public Item() {
}
public Item(int itemId, String itemCode, String name, ...
this.itemId = itemId;
this.itemCode = itemCode;
this.name = name;
this.initialPrice = initialPrice;
}
public Item(String itemCode, String name, double initi...
this.itemCode = itemCode;
this.name = name;
this.initialPrice = initialPrice;
}
public String toString() {
return new ToStringBuilder(this).append("id", getIte...
"code", getItemCode()).append("Name", getName())...
"price", getInitialPrice()).toString();
}
getter/setterは省略
}
-Item.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hiberna...
"http://hibernate.sourceforge.net/hibernate-mapping-3.0....
<!-- Generated 2006/09/24 21:45:30 by Hibernate Tools 3....
<hibernate-mapping>
<class name="nu.mine.kino.entity.webdb1.Item" table="I...
<id name="itemId" type="int">
<column name="ITEM_ID" />
<generator class="increment" />
</id>
<version name="version" type="int">
<column name="VERSION" not-null="true" />
</version>
<property name="itemCode" type="string">
<column name="ITEM_CODE" length="10" not-null="tru...
</property>
<property name="name" type="string">
<column name="NAME" length="256" not-null="true" />
</property>
<property name="initialPrice" type="double">
<column name="INITIAL_PRICE" precision="22" scale=...
</property>
</class>
</hibernate-mapping>
***DAO [#fe878fed]
-DAO (interface)
package nu.mine.kino.entity.webdb1;
import java.util.List;
public interface IItemDAO {
Item save(Item item);
void delete(Item item);
Item update(Item item);
Item findById(int id);
List findByExample(Item instance);
}
-DAOの実装(Powered by Spring)
package nu.mine.kino.entity.webdb1;
import org.apache.log4j.Logger;
import java.util.List;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Example;
import org.springframework.orm.hibernate3.support.Hibern...
/**
* @author Masatomi KINO
* @version $Revision$
* @spring.bean id = "itemDao"
* @spring.property name = "sessionFactory" ref = "sessi...
*/
public class ItemDAO extends HibernateDaoSupport impleme...
private static final Logger logger = Logger.getLogger(...
public List findByExample(Item instance) {
DetachedCriteria dc = DetachedCriteria.forClass(Item...
List results = getHibernateTemplate().findByCriteria...
return results;
}
.. その他の実装は省略
}
**やってみる [#e61da8fe]
DAOの単体テストクラスを作って、その中で実際に検索を行いま...
***データのセットアップ [#s32caa72]
tableには以下のようなデータが入っています。
|LEFT:ITEM_ID|LEFT:ITEM_CODE|LEFT:NAME|LEFT:INITIAL_PRICE...
|RIGHT:21|LEFT:C003|LEFT:商品21|RIGHT:505.5|RIGHT:0|
|RIGHT:23|LEFT:C003|LEFT:商品21_01|RIGHT:202.5|RIGHT:0|
|RIGHT:24|LEFT:C004|LEFT:商品22_01|RIGHT:302.8|RIGHT:0|
|RIGHT:25|LEFT:C003|LEFT:商品21_02|RIGHT:0|RIGHT:0|
***単体テストクラス [#lf8dbd33]
public class ItemDAOTestWithSpring extends
AbstractTransactionalDataSourceSpringContextTests {
public void testFindByExample() {
logger.debug("testFindByExample() - start");
Item example = new Item();
example.setItemCode("C003");
example.setInitialPrice(202.5);
List list = dao.findByExample(example);
logger.debug("結果は " + list.size() + " 件でした");
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Item element = (Item) iterator.next();
logger.debug(element);
}
logger.debug("testFindByExample() - end");
}
.....あとはいろいろ省略
}
***検索結果 [#b4e8b83a]
上の検索結果ですが、検索条件は「ITEM_CODE='C003' and INIT...
結果は 1 件でした
nu.mine.kino.entity.webdb1.Item@d5c0f9[id=23,code=C003,N...
となります。
**いろいろな検索条件 [#p51d792d]
***0を除く [#r103ab9f]
先の検索条件を
Item example = new Item();
example.setItemCode("C003");
// example.setInitialPrice(202.5);
List list = dao.findByExample(example);
と変更します。検索条件は「ITEM_CODE='C003'」ということで、
|LEFT:ITEM_ID|LEFT:ITEM_CODE|LEFT:NAME|LEFT:INITIAL_PRICE...
|RIGHT:21|LEFT:C003|LEFT:商品21|RIGHT:505.5|RIGHT:0|
|RIGHT:23|LEFT:C003|LEFT:商品21_01|RIGHT:202.5|RIGHT:0|
|RIGHT:25|LEFT:C003|LEFT:商品21_02|RIGHT:0|RIGHT:0|
がヒットしそうですが、検索結果は
|RIGHT:25|LEFT:C003|LEFT:商品21_02|RIGHT:0|RIGHT:0|
の1件のみになります。これはこのテーブルのINITIAL_PRICEの...
さて
Item example = new Item();
example.setItemCode("C003");
List list = dao.findByExample(example);
としたら「ITEM_CODE='C003'」のレコードがすべて返却される...
DetachedCriteria dc = DetachedCriteria.forClass(Item.cla...
List results = getHibernateTemplate().findByCriteria(dc);
return results;
を
DetachedCriteria dc = DetachedCriteria.forClass(Item.cla...
dc.add(Example.create(instance).excludeZeroes()); <-追加。
List results = getHibernateTemplate().findByCriteria(dc);
return results;
とします。この設定をしておくと、0とセットされたカラムを検...
結果は 3 件でした
nu.mine.kino.entity.webdb1.Item@d5c0f9[id=21,code=C003,N...
nu.mine.kino.entity.webdb1.Item@1701bdc[id=23,code=C003,...
nu.mine.kino.entity.webdb1.Item@1353249[id=25,code=C003,...
となりました。ただこれだと、ホントにデータが0のレコードを...
***あるカラムだけ検索条件から除く [#xdf118f4]
DAOで以下のように設定します。
DetachedCriteria dc = DetachedCriteria.forClass(Item.cla...
dc.add(Example.create(instance).excludeProperty("initial...
List results = getHibernateTemplate().findByCriteria(dc);
return results;
こうしておくと、initialPrice フィールドは検索条件から除外...
Item example = new Item();
example.setItemCode("C003");
example.setInitialPrice(100000.0); <-除外されたカラム
List list = dao.findByExample(example);
などとしても検索結果は
結果は 3 件でした
nu.mine.kino.entity.webdb1.Item@d5c0f9[id=21,code=C003,N...
nu.mine.kino.entity.webdb1.Item@1701bdc[id=23,code=C003,...
nu.mine.kino.entity.webdb1.Item@1353249[id=25,code=C003,...
となります。initialPriceは正しく小文字で始めないとダメみ...
***そもそも、識別子は除外される。 [#a20c4447]
キーやバージョンのプロパティなどは検索条件から除外される...
Item example = new Item();
example.setItemId(1); <-適当な値
example.setVersion(100); <-適当な値
example.setItemCode("C003");
List list = dao.findByExample(example);
としても3件ヒットしました。また、nullや''がセットされて...
***部分一致とか [#e58f454b]
次にNameカラムでいろいろ試してみます。DAOは
DetachedCriteria dc = DetachedCriteria.forClass(Item.cla...
dc.add(Example.create(instance).excludeZeroes());
List results = getHibernateTemplate().findByCriteria(dc);
とします。再掲ですがデータは
|LEFT:ITEM_ID|LEFT:ITEM_CODE|LEFT:NAME|LEFT:INITIAL_PRICE...
|RIGHT:21|LEFT:C003|LEFT:商品21|RIGHT:505.5|RIGHT:0|
|RIGHT:23|LEFT:C003|LEFT:商品21_01|RIGHT:202.5|RIGHT:0|
|RIGHT:24|LEFT:C004|LEFT:商品22_01|RIGHT:302.8|RIGHT:0|
|RIGHT:25|LEFT:C003|LEFT:商品21_02|RIGHT:0|RIGHT:0|
でした。
まずは完全一致から。
Item example = new Item();
example.setName("商品21");
List list = dao.findByExample(example);
と実行すると完全一致のため
|LEFT:ITEM_ID|LEFT:ITEM_CODE|LEFT:NAME|LEFT:INITIAL_PRICE...
|RIGHT:21|LEFT:C003|LEFT:商品21|RIGHT:505.5|RIGHT:0|
がヒットします。
結果は 1 件でした
nu.mine.kino.entity.webdb1.Item@1701bdc[id=21,code=C003,...
部分一致させるためにはDAO内で部分一致を有効にする必要があ...
DetachedCriteria dc = DetachedCriteria.forClass(Item.cla...
dc.add(Example.create(instance).excludeZeroes().enableLi...
List results = getHibernateTemplate().findByCriteria(dc);
検索側も
example.setName("商品21%");
とすることで部分一致検索となります。
結果は 3 件でした
nu.mine.kino.entity.webdb1.Item@1579a30[id=21,code=C003,...
nu.mine.kino.entity.webdb1.Item@4bfe6b[id=23,code=C003,N...
nu.mine.kino.entity.webdb1.Item@12c5431[id=25,code=C003,...
と検索結果は3件になりました。
**参考リンク [#c9cc61a2]
-[[Kodersのサンプル(QueryByExampleTest.java)>http://www.k...
-http://anonhibernate.labs.jboss.com/trunk/Hibernate3/doc...
----
この記事は
#vote(おもしろかった[6],そうでもない[3])
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}
ページ名: