Jpa 具有空值关系中目标实体属性的类JPQL表达式

Jpa 具有空值关系中目标实体属性的类JPQL表达式,jpa,eclipselink,jpql,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 Categor

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

这也没用。如何使其仅在类别不为null时检查类别名称?

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

尝试使用左连接:

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

谢谢你抽出时间。参数不为null。它是
item.category
,具有空值,因此在比较
item.category.name
的值时会导致意外结果。你误解了这个问题。我给的标题可能就是原因。