[Seasar-user:17955] S2Dao 1.0.50 で Date型を使用した検索の不具合

[E-MAIL ADDRESS DELETED] [E-MAIL ADDRESS DELETED]
2009年 7月 9日 (木) 11:14:09 JST


豊島(トヨシマ)です。

S2Dao 1.0.50 を使っていて困ったことに成っております。

次の再現手順で行うと4の「※失敗」のところで必ず失敗してしまいます。
実行しているSQL文を手動で実行するとレコードは返ってきているようです。
SQLのDate型を検索条件にすると取得に失敗しているようです。
何が原因でしょうか?

【再現手順】

1.MySQLでテーブルを作成。
CREATE TABLE IF NOT EXISTS `Birthday` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  `birthday` date NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ;
INSERT INTO `Birthday` (`id`, `name`, `birthday`) VALUES (1, '名前', '1977-10-14');

2.Daoクラスを作成

import java.util.Date;
import org.seasar.dao.annotation.tiger.Arguments;
import org.seasar.dao.annotation.tiger.Query;
import org.seasar.dao.annotation.tiger.S2Dao;

@S2Dao(bean = Birthday.class)
public interface BirthdayDao {
	@Arguments( { "date" })
	@Query("birthday = /*date*/")
	public Birthday getBirthdayByDate(Date date);

	@Arguments( { "id" })
	@Query("id = /*id*/")
	public Birthday getBirthdayById(Integer id);
}

3.Entityを作成

import java.util.Date;
import org.seasar.dao.annotation.tiger.Bean;
@Bean
public class Birthday {
	private Integer id;
	private String name;
	private Date birthday;
	(getter setter省略)
}

4.Testを実行
public void testGetBirthdayByDate() {
	Calendar cal = Calendar.getInstance();
	cal.set(Calendar.YEAR, 1977);
	cal.set(Calendar.MONTH, Calendar.OCTOBER);
	cal.set(Calendar.DAY_OF_MONTH, 14);
	Date day = cal.getTime();
	Birthday birthday;

	birthday = birthdayDao.getBirthdayById(1);
	assertNotNull(birthday); // 成功
	cal.setTime(birthday.getBirthday());
	assertEquals(1977, cal.get(Calendar.YEAR)); // 成功
	assertEquals(Calendar.OCTOBER, cal.get(Calendar.MONTH)); // 成功
	assertEquals(14, cal.get(Calendar.DAY_OF_MONTH)); // 成功

	birthday = birthdayDao.getBirthdayByDate(day);
	assertNotNull(birthday); // ※失敗
	cal.setTime(birthday.getBirthday());
	assertEquals(1977, cal.get(Calendar.YEAR));
	assertEquals(Calendar.OCTOBER, cal.get(Calendar.MONTH));
	assertEquals(14, cal.get(Calendar.DAY_OF_MONTH));
}

※テスト実行のSQLログ
SELECT Birthday.birthday, Birthday.id, Birthday.name FROM Birthday WHERE id = 1
SELECT Birthday.birthday, Birthday.id, Birthday.name FROM Birthday WHERE birthday = '1977-10-14'


Seasar-user メーリングリストの案内