![](/img/trans.png)
[英]Is this query possible using Criteria or DetachedCriteria Hibernate
[英]Hibernate using DetachedCriteria with interfaces
我正在使用Hibernate 3.6.8.Final和Spring 3.0.5.RELEASE,为具有多个实现的类添加一些Common DAO功能,这些实现被上层覆盖以实现特定的类,但不适用于DetachedCriteria。
例:
在基类中:
public interface ICat {
public void setMeowSound(String meow);
public String getMeowSound();
}
然后,每个继承的项目都将定义休眠注释。
例如
@Entity
@Table(name="SQUAWKY_CATS")
public class SquawkyMeowingCat implements ICat, Serializable {
@Id
@Column(name="SQUAWK_NAME")
private String meow;
public String getMeowSound() {
return meow;
}
public void setMeowString(String meow) {
this.meow = meow;
}
}
这意味着我可以使用:
Criteria criteria = Session.createCriteria(ICat.class);
而且Spring / Hibernate知道它从特定项目的具体继承中提取了ICat的注释。
但是,如果我尝试这样做:
DetachedCriteria subQuery = DetachedCriteria.forClass(ICat.class,"inner"); // etcetera
然后在运行时为ICat获得了一个未知实体。
现在这很有意义,因为首先是在Session之外创建它,因此它具有所需的所有配置,而DetachedCriteria是静态方法,但是在尝试执行以下操作时会出错
criteria.list()
到那时它已经开始了Session并应该知道ICat实际上是一个带有所有注释的SquawkyMeowingCat。
所以我的问题分为两部分:
1)这是已知的行为,并且会永远如此吗?
2)谁能想到一种简单的方法,而无需使用接口和具体的ClassHolder来交出需要创建的类的实例?
我不确定DetachedCriteria的情况,但是避免显式依赖具体类的一种方法可能是使用接口查询Hibernate的元数据:
public <T> Class<? extends T> findEntityClassForEntityInterface(
SessionFactory sessionFactory,
Class<T> entityInterface
) {
for (ClassMetadata metadata : sessionFactory.getAllClassMetadata().values()) {
Class entityClass = metadata.getMappedClass(EntityMode.POJO);
if (entityInterface.isAssignableFrom(entityClass)) {
return entityClass;
}
}
return null;
}
关于说明性代码片段健壮性的常见警告。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.