ちょっとローカルで話題になったので。


public abstract class AvailablePeriod {

public static final Date MIN_DATE; //デフォルトの最小値
public static final Date MAX_DATE; //デフォルトの最大値

private Date from = MIN_DATE;
private Date to = MAX_DATE;

static {
GregorianCalendar min = new GregorianCalendar(1900, 0, 1, 0, 0, 0);
MIN_DATE = min.getTime();
GregorianCalendar max = new GregorianCalendar(2999, 11, 31, 23, 59, 59);
MAX_DATE = max.getTime();
}

public AvailablePeriod() {
super();
}

public void setFrom(Date from) {
this.from = from;
}

public void setTo(Date to) {
this.to = to;
}

/**
* @hibernate.property column="AVAILAVLE_FROM"
*/
public Date getFrom() {
return from;
}

/**
* @hibernate.property column="AVAILAVLE_TO"
*/
public Date getTo() {
return to;
}
}

という感じで「有効期間」クラスを定義しておき、

class PeriodedDataMapper {

/**
* 指定時刻時点で有効なデータを取得する
*/
public List findAllAvailable(Class targetClass, Date date) {
// HibernateのSessionオブジェクトを取得する(詳細略)
Session session = UnitOfWork.getCurrent().getSession();
try {
String queryString = "from "
+ targetClass.getName()
+ " as object where "
+ "object.availablePeriod.from <= :date "
+ "and object.availablePeriod.to >= :date";
Query query = session.createQuery(queryString);
query.setDate("date", date);
return query.list();
} catch (HibernateException e) {
return null; //手抜き
}
}

/**
* システム現在時刻時点で有効なデータを取得する
*/
public List findAllAvailable(Class targetClass) {
return this.findAllAvailable(targetClass, new Date());
}
}

という感じにMapperを書いてやれば、よくある「有効開始日・有効終了日」を持っているようなマスタメンテが楽にできるかなあ、と。
クエリを文字列編集しているのがダサいですが。Criteriaを使えばほかの条件との組み合わせもできるかも。