2013-03-15 69 views
2

我有一個名爲Item的實體,與另一個實體Category之間的關係可以爲null。這兩個實體如下:JPQL LIKE表達式與空值關係中的目標實體的屬性

項目

@Entity 
public class Item { 
    @Id 
    private String id; 
    private String name; 
    private String code; 
    @ManyToOne 
    private Category category; 
} 

類別

@Entity 
public class Category { 
    @Id 
    private String id; 
    private String name; 
} 

現在,我必須選擇具有代碼項目類別名稱類似於一個搜索詞,對於這點我嘗試以下查詢:

"SELECT item FROM Item item " 
       + "WHERE item.code LIKE :searchTerm OR item.name LIKE :searchTerm " 
       + "OR item.category.name LIKE :searchTerm" 

searchTerm使用

query.setParameter("searchTerm", "%" + searchTerm + "%"); 

設置,但它不會導致將是空的,如果category爲空(否則工作) 。我也試過以下查詢。

"SELECT item FROM Item item " 
       + "WHERE item.code LIKE :searchTerm OR item.name LIKE :searchTerm " 
       + "OR (item.category IS NOT NULL AND item.category.name LIKE :searchTerm)" 

這也沒有奏效。我如何才能使它僅在類別不爲空時檢查類別名稱?

回答

2

嘗試使用左連接:

"SELECT item FROM Item item LEFT JOIN item.category cat" 
      + "WHERE item.code LIKE :searchTerm OR item.name LIKE :searchTerm " 
      + "OR (cat.categoryID IS NOT NULL AND cat.name LIKE :searchTerm)" 

JPQL documentation

+0

非常感謝。有效。 – 2013-03-15 09:11:13

1

只需檢查null爲上述參數化的值。 jpa不會返回空指針異常,因爲我們僅在雙引號內給出null。所以和java一樣,它以null作爲字符串,並從數據庫中嘗試'%null%'的值。所以,它返回空列表。

+0

感謝花費時間烏爾。該參數不爲null。它是'item.category',它具有空值,因此在比較'item.category.name'的值時會導致意外的結果。你誤解了這個問題。我給的標題可能是原因。 – 2013-03-15 08:27:21

相關問題