2009-11-03 41 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