2011-12-13 103 views
0
处理的空引用

我使用休眠和我有一个实体像查询在Hibernate中

@Entity 
@Table(name = "MyEntity") 
Class MyEntity { 
     @Id 
    @GeneratedValue 
    private long id; 

    @Column(name = "NAME") 
    private String name; 

    //some more attributes here 

     @OneToOne 
    @JoinColumn(name = "PARENT_ID") 
     MyEntity parent; 

} 

我在数据库

id | name | parent_id 

125 | n1 | null 

一个记录,当我试图让这个纪录休眠查询

Select e.id,e.name,e.parent.name from MyEntity e where e.id =125 

此查询返回零记录。因为父母在这里是null,所以有什么办法来处理这种情况。 感谢advc。

+0

它没有任何意义。你为什么认为这是因为父母为空? – elias

+0

但我想要那条记录。如果parent为空,它应该返回e.parent.name null。 –

+0

'e.parent.name'导致内部连接失败,因为null。检查了这一点:[http://stackoverflow.com/questions/601615/how-to-simulate-nvl-in-hql](http://stackoverflow.com/questions/601615/how-to-simulate-nvl-在-HQL) –

回答

5

在你的情况Hibernate隐式地使用内部连接,当其中一边是null时不返回任何东西。

您可以指示休眠使用左外连接代替如下:

select e.id, e.name, p.name from MyEntity e left join e.parent p where e.id = 125 
-1

像其他人说,这导致了innerjoin ...

您可以添加以下属性到您的休眠:

hibernate.show_sql=true 
hibernate.format_sql=true 

这样你就可以知道什么Hibernate是试图做的,自己通知这些问题...

如果生成的SQL没有给你预期的结果,那么你的休眠请求有问题。 在这种情况下,不难理解,您必须让hibernate执行左外连接而不是内连接。

如果有一天你需要方法的参数,看看这个: Hibernate show real SQL

你也可以使用了标准的API时,有在每一个方向上不加入,这是相当简单等强大的使用和维护。