我有一个名为Item
的实体,与另一个实体Category
有关,可以为空。这两个实体如下:
物品
@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
为null,则结果不会为空(否则有效)。我也尝试了以下查询。
"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)"
这也行不通。如果类别不为空,我怎样才能检查类别名称?
答案 0 :(得分: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)"
答案 1 :(得分:1)
只需检查上述参数化值的null即可。 jpa不返回空指针异常,因为我们只在双引号内给出null。所以像java一样,它将null作为字符串并从db中尝试'%null%'的值。这样,它返回空列表。