【问题标题】:JPQL LIKE expression with attributes of target entity in a null valued relationship具有空值关系中目标实体属性的 JPQL LIKE 表达式
【发布时间】:2013-03-03 17:35:12
【问题描述】:

我有一个名为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;
}

现在,我必须选择 namecodecategory name 类似于搜索词的 items ,为此我尝试了以下查询:

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

这也不起作用。仅当类别不为空时,如何才能检查类别名称?

【问题讨论】:

    标签: jpa eclipselink jpql


    【解决方案1】:

    尝试使用左连接:

    "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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢您抽出宝贵时间。参数不为空。它是item.category,它具有空值,因此在比较item.category.name 的值时会导致意外结果。你误解了这个问题。我给的标题可能是原因。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-09
      • 1970-01-01
      • 1970-01-01
      • 2021-06-14
      • 1970-01-01
      • 2012-09-11
      • 2013-03-19
      相关资源
      最近更新 更多