Hibernate Single Table,查询所有行

时间:2015-10-15 13:45:11

标签: java spring hibernate postgresql-9.3

所以,我习惯于将Hibernate 4与Annotations一起使用一段时间了。我传统上每桌完成一个具体的课程,完成并完成,这一直对我有用。

现在,我仍在使用Hibernate 4.3.11,并且我第一次使用单表层次结构。我有一个main / root类如下:

@Entity
@Table(name = "mytable")
@SuppressWarnings("serial")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "myobject_type", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue(value = "ABC")
public class MyEntity extends BaseEntity

所以,我想知道这个类是否应该是抽象类???它似乎不是必须的。

SubClass定义如下:

@Entity
@DiscriminatorValue(value = "XYZ")
public class XyzEntity extends MyEntity

我为MyEntity创建了一个DAO,并且这些方法的单元测试创​​建/ update / findById似乎都可以工作......但是“getAllList”似乎没有。

@Override
public List<MyEntity> getAllList()
{
    List<MyEntity> myList = this.sessionFactory.getCurrentSession().createQuery("from MyEntity").list();
    return myList;
}

当我对此方法进行单元测试时,收到错误消息。

org.hibernate.WrongClassException: Object [id=708] was not of the specified subclass [com.myapp.server.model.common.MyEntity] : Discriminator: XYZ

我应该说我在数据库中有4条记录。 2条记录在“myobject_type”字段中的值为“XYZ”,另一条的值为“ABC”

所以,我想知道我是否应该在我的根类中打扰一个DiscriminatorValue ???我使该字段“myobject_type”不为空,因此,我会确保每条记录都有一个来自MyEntity的记录的描述符值“ABC”,如果创建了XyzEntity,则为“XYZ”的值。同样,新的MnoEntity可能在该字段中具有“MNO”值。

只是好奇,在整个层次结构中,如果我有两个MyEntity子类,我可以在这两个子实体中使用相同的字段吗?或者,我想我可以移动这样的东西,一个在多个地方使用的字段到根实体。

同样,这是我第一次使用Hibernate中的单表层次结构,我只需要解决此错误消息。非常感激任何的帮助!!!谢谢!

汤姆

1 个答案:

答案 0 :(得分:0)

尝试在查询创建中直接对此值执行SQL查询过滤,而不是使用@DiscriminatorColumn和@DiscriminatorValue执行此操作。

 List<MyEntity> myList = this.sessionFactory.getCurrentSession().createQuery("from MyEntity where myobject_type != :pattern").setParameter("pattern", pattern).list();
return myList;