Hibernate生成模糊的SQL查询

时间:2017-03-20 16:07:14

标签: java hibernate

考虑以下 ParentClass 实体:

@Entity
@Table(schema = "iwrs")
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class ParentClass {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PK_IWRS")
    public int id;

    public String name;

    public ParentClass(String name) {
        this.name = name;
    }
}

以下 ChildClass 实体:

@Entity
@Table(schema = "iwrs")
public class ChildClass extends ParentClass {

    @ManyToOne(targetEntity=ParentClass.class)
    @JoinColumn(name="parent_id")
    private ParentClass parent;

    public ChildClass(String name) {
        super(name);
    }
}

如您所见,此ChildClass从ParentClass扩展而来。此外,它包含在字段中映射的ParentClass的引用。

有一点我想获得ParentClass的所有实例,而不是ChildClass的实例。

我四处搜寻,发现可以用这个标准来实现:

Criteria criteria = sessionFactory.getCurrentSession()
                .createCriteria(ParentClass.class, "parentClass")
                .add(Restrictions.eq("class", ParentClass.class));

但是,当我尝试列出它时,我收到以下错误:

  

错误SqlExceptionHelper:147 - 错误:列引用" clazz _"是   暧昧

如果删除条件的最后一行,则查询成功执行。但是也返回了ChildClass实例,这不是我想要的。

当我有所有限制时,这是hibernate生成的查询:

  

选择this_.id为id1_29_1_,this_.name为name2_29_1_,   this_.parent_id为parent_i1_14_1_,this_.clazz_为clazz_1_,   parentclas2_.id为id1_29_0_,parentclas2_.name为name2_29_0_,   parentclas2_.parent_id为parent_i1_14_0_,parentclas2_.clazz_ as   clazz_0_ from(select id,name,null :: int4 as parent_id,0 as clazz_   从iwrs.parent_class union中选择id,name,parent_id,1 as   来自iwrs.child_class的clazz_)this_ left outer join(select id,   name,null :: int4 as parent_id,0 as clazz_ from iwrs.parent_class   union all选择id,name,parent_id,1为clazz_ from   iwrs.child_class)parentclas2_ on this_.parent_id = parentclas2_.id   clazz _ =?

这里提供的工作示例:https://github.com/mmalmeida/hibernateTest,只需运行测试RetrieveParentTest.java。

你知道如何解决这个问题吗?

提前致谢!

1 个答案:

答案 0 :(得分:2)

尝试使用您定义的别名:

Criteria criteria = sessionFactory.getCurrentSession()
                    .createCriteria(ParentClass.class, "parentClass")
                    .add(Restrictions.eq("parentClass.class", ParentClass.class));