连接空字段的 JPA 查询
JPA query to concat null field
您好,这是连接品牌名称、标题和副标题的查询
@Query(value="SELECT c FROM ProductOption c WHERE cast( c.id AS string ) like %:search% or CONCAT(COALESCE(c.product.brand.name,''),' ',c.product.title,' ',c.underTitle) like %:search%")
Page<ProductOption> findAllBySearch(String search,Pageable pageable);
但是每次 brand 为 null 时,productoption 都不包含在响应中..
基本上我想要的是连接品牌名称、标题和副标题,如果品牌不为空,如果它为空,则按标题和副标题连接..
我尝试了很多使用 CASE etd 的方法...
当您连接 WHERE 子句中的字符串时,您使用 path operator "." 从 ProductOption
导航到 product
,然后从那里导航到 brand
。
@Query(value="... CONCAT(COALESCE(c.product.brand.name,''),' ',c.product.title,' ',c.underTitle) like %:search%")
这会在生成的 SQL 语句中创建 2 INNER JOINs,排除没有 product
或没有 product
的 ProductOption
brand
.
您可以通过在 FROM 子句中 defining LEFT JOINs 并在 WHERE 子句中引用这些 JOINS 的别名来避免这种情况:
@Query(value="SELECT c FROM ProductOption c LEFT JOIN c.product p LEFT JOIN p.brand b WHERE cast( c.id AS string ) like %:search% or CONCAT(COALESCE(b.name,''),' ',p.title,' ',c.underTitle) like %:search%")
Page<ProductOption> findAllBySearch(String search,Pageable pageable);
您好,这是连接品牌名称、标题和副标题的查询
@Query(value="SELECT c FROM ProductOption c WHERE cast( c.id AS string ) like %:search% or CONCAT(COALESCE(c.product.brand.name,''),' ',c.product.title,' ',c.underTitle) like %:search%")
Page<ProductOption> findAllBySearch(String search,Pageable pageable);
但是每次 brand 为 null 时,productoption 都不包含在响应中..
基本上我想要的是连接品牌名称、标题和副标题,如果品牌不为空,如果它为空,则按标题和副标题连接..
我尝试了很多使用 CASE etd 的方法...
当您连接 WHERE 子句中的字符串时,您使用 path operator "." 从 ProductOption
导航到 product
,然后从那里导航到 brand
。
@Query(value="... CONCAT(COALESCE(c.product.brand.name,''),' ',c.product.title,' ',c.underTitle) like %:search%")
这会在生成的 SQL 语句中创建 2 INNER JOINs,排除没有 product
或没有 product
的 ProductOption
brand
.
您可以通过在 FROM 子句中 defining LEFT JOINs 并在 WHERE 子句中引用这些 JOINS 的别名来避免这种情况:
@Query(value="SELECT c FROM ProductOption c LEFT JOIN c.product p LEFT JOIN p.brand b WHERE cast( c.id AS string ) like %:search% or CONCAT(COALESCE(b.name,''),' ',p.title,' ',c.underTitle) like %:search%")
Page<ProductOption> findAllBySearch(String search,Pageable pageable);