2

我有一个实体命名为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但如果为空(否则有效),则结果不会为空。我也尝试了以下查询。

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

这也没有奏效。仅当类别不为空时,如何才能检查类别名称?

4

2 回答 2

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 文档

于 2013-03-15T08:36:59.767 回答
1

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

于 2013-03-15T07:41:29.147 回答