2009-11-03 125 views
1

我有一个查询,在普通的SQL中工作,但不是在JPA上工作,并找不到原因。正如你可以从标题中猜出的,我有一个线索,但我不知道如何“修复”它。JPA加入空值列

下面是实际的重要代码:

@Id 
@Basic(optional = false) 
@Column(name = "id", nullable = false) 
private Integer id; 

@Basic(optional = false) 
@Column(name = "read_permission", nullable = false) 
private boolean readPermission; 

@Basic(optional = false) 
@Column(name = "write_permission", nullable = false) 
private boolean writePermission; 

@Basic(optional = false) 
@Column(name = "execute_permission", nullable = false) 
private boolean executePermission; 

@Basic(optional = false) 
@Column(name = "admin_permission", nullable = false) 
private boolean adminPermission; 

@JoinColumn(name = "xinco_core_data_id", referencedColumnName = "id", nullable=true) 
@ManyToOne(fetch = FetchType.LAZY) 
private XincoCoreData xincoCoreDataId; 
@JoinColumn(name = "xinco_core_group_id", referencedColumnName = "id", nullable=true) 
@ManyToOne(fetch = FetchType.LAZY) 
private XincoCoreGroup xincoCoreGroupId; 

@JoinColumn(name = "xinco_core_node_id", referencedColumnName = "id", nullable=true) 
@ManyToOne(fetch = FetchType.LAZY) 
private XincoCoreNode xincoCoreNodeId; 

@JoinColumn(name = "xinco_core_user_id", referencedColumnName = "id", nullable=true) 
@ManyToOne(fetch = FetchType.LAZY) 
private XincoCoreUser xincoCoreUserId; 

而这里的工作SQL:

select * from xinco_core_ace where xinco_core_user_id = 1 order by xinco_core_user_id, xinco_core_node_id, xinco_core_data_id; 

这里就是我试图做的事:

SELECT xca FROM XincoCoreAce xca WHERE xca.xincoCoreUserId.id = 1 ORDER BY xca.xincoCoreUserId.id, xca.xincoCoreGroupId.id, xca.xincoCoreNodeId.id, xca.xincoCoreDataId.id 

问题,我认为,xca.xincoCoreUserId.id,xca.xincoCoreGroupId.id,xca.xincoCoreNodeId.id,xca.xincoCoreDataId.id可以是nul LS。

有什么想法?希望更容易阅读:P

+0

一般来说,在一个问题中做代码转储是一个坏主意。您应该尽量减少代码以证明问题。如果让阅读和理解更容易(因此阅读和回答的可能性更大),如果没有其他内容,则表明您已经付出了一些努力。干杯。 – cletus 2009-11-03 14:37:19

+0

感谢您的反馈意见,这只是我的第二个问题,并且是第一个与相关代码相关的问题。希望现在更清洁。 – javydreamercsw 2009-11-03 14:57:54

回答

1

也发生在我身上用一个简单的查询:

select t from Task t where t.worker is not null order by t.worker.normalizedName 

发现,在属性工人为空(任务未分配)的任何任务结果的实体将被丢弃。后来我发现这是因为JPA中的路径导航是使用内部联接完成的(规范如此说明),并且这将排除任何结果,其中一部分路径为空。

此错误报告准确描述了问题:

https://bugs.eclipse.org/bugs/show_bug.cgi?id=363798

不幸的是,这不是一个错误的实现和你将不得不重构你的实体/查询,以避免这些种情况。

0

我不是JPA的专家,但我会尝试获取在数据库上运行的实际SQL。也许FetchType.LAZY与这个问题有关系?

+0

如果你使用Hibernate作为你的JPA提供者,你可以看一下http://www.javalobby.org/java/forums/t44119.html 这有点旧,所以我希望它仍然有效。 – kovica 2009-11-03 17:48:16

+0

我正在使用EclipseLink,但我会看看。 – javydreamercsw 2009-11-05 14:27:49

+0

这是完成的实际查询(使用eclipselink日志记录): SELECT t1.id,t1.write_permission,t1.admin_permission,t1.execute_permission,t1。read_permission,t1.xinco_core_user_id,t1.xinco_core_data_id,t1.xinco_core_group_id,t1.xinco_core_node_id FROM xinco_core_data t4,xinco_core_node t3,xinco_core_group t2,xinco_core_ace t1,xinco_core_user t0 WHERE((t3.id =?)AND((((t3.id = AND(t2.id = t1.xinco_core_group_id))AND(t2.id = t1.xinco_core_group_id))AND(t4.id = t1.xinco_core_data_id)))ORDER BY t0.id ASC,t2.id ASC, t3.id ASC,t4.id ASC bind => [1] – javydreamercsw 2009-11-05 14:46:36

1

这样做(使用的EclipseLink日志记录)的实际查询:

SELECT t1.id, t1.write_permission, t1.admin_permission, t1.execute_permission, t1.read_permission, t1.xinco_core_user_id, t1.xinco_core_data_id, t1.xinco_core_group_id, t1.xinco_core_node_id FROM xinco_core_data t4, xinco_core_node t3, xinco_core_group t2, xinco_core_ace t1, xinco_core_user t0 WHERE ((t3.id = ?) AND ((((t3.id = t1.xinco_core_node_id) AND (t0.id = t1.xinco_core_user_id)) AND (t2.id = t1.xinco_core_group_id)) AND (t4.id = t1.xinco_core_data_id))) ORDER BY t0.id ASC, t2.id ASC, t3.id ASC, t4.id ASC bind => [1] 

对于具有由级的一些原因,增加了很多表格交叉检查,其中具有空使结果出来了空。

通过获取所需结果来删除订单(当然无序)。

看到这个的EclipseLink bug