问题描述
@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);
然而,每次品牌为空时,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,排除没有 ProductOption
的 product
或没有 product
的 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);