JPQL LIKE表达式,其目标实体的属性为空值关系

时间:2013-03-15 04:56:33

标签: jpa eclipselink jpql

我有一个名为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)"

这也行不通。如果类别不为空,我怎样才能检查类别名称?

2 个答案:

答案 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)"

JPQL documentation

答案 1 :(得分:1)

只需检查上述参数化值的null即可。 jpa不返回空指针异常,因为我们只在双引号内给出null。所以像java一样,它将null作为字符串并从db中尝试'%null%'的值。这样,它返回空列表。