2017-06-14 74 views
1

我正在使用JPA並有我想訪問的視圖。我在許多其他類中使用嵌入ID的映射實體來訪問具有類似要求的表。然而,在視圖中包含id的空值中,整個對象返回爲null。當我查詢時返回的實體的數量是正確的,但它們是空的。使用JPA訪問沒有唯一id的視圖返回null

這裏是類:

{ 
@Entity 
@Table(name = "VW_PRODUCT") 
public class VwProduct implements Serializable { 
    @EmbeddedId 
    private VwProductId id; 

    public VwProduct() { 
    } 
} 

{ 
@Embeddable 
public class VwProductId implements java.io.Serializable { 

    @Column(name = "PROD_NAME", nullable=true) 
    private String prodName; 
    @Column(name = "PROD_CTGRY", nullable=true) 
    private String prodCtgry; 
    @Column(name = "PROD_SBCTGRY", nullable=true) 
    private String prodSbctgry; 
} 

我忽略的東西像getter和setter和hashCode,但我認爲我的問題是清楚的;如何訪問這個視圖,當它的一些值爲空時? 謝謝!

回答

1

如果您的主鍵列爲null,並且該列上的搜索將始終返回沒有對象。

我知道有三種可能的解決方案,按照複雜性/好奇性排序。 (對於不能在只讀視圖中工作的人,請不要執行以下任何操作,您將用一把令人難以置信的大型霰彈槍吹滅你的腳。)

最簡單的答案是更改視圖的定義並添加像rowid或生成的序列,然後將其作爲主鍵。

第二個答案,這既是實現特定的和休眠的具體,是有@ID @ROWID String id;

最後答案的主鍵,是比較複雜的,是由所有三貴字段映射到「NullableString 「UserType,並且有一個nullSafeGet,它將null映射爲非null的內容,如」'或其他內容。你會得到重複的,但由於這是一個只讀視圖,你並不在乎。

+0

非常感謝您回答這個問題,當我意識到我之前遇到過這個問題時,我確實做了第一個選擇,並查找了我是如何修復它的。另外兩個選項聽起來也很有意思,下次可能會生病。再次感謝! –