【问题标题】:Convert SQL to JPQL: INNER JOIN with SELECT将 SQL 转换为 JPQL:INNER JOIN 与 SELECT
【发布时间】:2019-08-23 18:48:42
【问题描述】:

我有以下 SQL 语句,用于对我的 Spring Boot 后端进行非常复杂的搜索。不,我需要将此传输到 JQPL 以用于我的存储库中的搜索方法。

SELECT DISTINCT dav_n.*
  FROM [DwhTest].[dbo].[DimensionAttributeValue] dav_n
  INNER JOIN [DwhTest].[dbo].[DimensionAttributeValue] dav_l on dav_n.MasterData_ID = dav_l.MasterData_ID AND dav_l.DimensionAttribute_ID = $PARAM1 AND dav_l.LstValue = $PARAMA2
        AND ((
            SELECT TOP 1 StartDate FROM DimensionAttributeValue
            WHERE MasterData_ID = dav_n.MasterData_ID AND DimensionAttribute_ID = dav_n.DimensionAttribute_ID AND StartDate <= getdate()
            ORDER BY StartDate DESC
        ) = dav_n.StartDate OR dav_n.StartDate IS NULL)
  WHERE dav_n.DimensionAttribute_ID = $PARAM3 AND dav_n.ChrValue LIKE '$PARAM4%'

$PARAM1 - $PARAM4 是我的搜索变量。以下清单是我的PagingAndSortingRepository的代码:

@Query(value = "SELECT DISTINCT dav_n FROM DimensionAttributeValue dav_n " +
            "INNER JOIN DimensionAttributeValue dav_l on dav_n.MasterData_ID = dav_l.MasterData_ID AND dav_l.DimensionAttribute_ID = :lstAttributeId AND dav_l.LstValue = :lstValue " +
            "AND ((SELECT TOP 1 StartDate FROM DimensionAttributeValue WHERE MasterData_ID = dav_n.MasterData_ID AND DimensionAttribute_ID = dav_n.DimensionAttribute_ID AND StartDate <= getdate() ORDER BY StartDate DESC) = dav_n.StartDate OR dav_n.StartDate IS NULL)" +
            "WHERE dav_n.DimensionAttribute_ID = :chrValueAttributeId AND dav_n.ChrValue LIKE ':chrValue%'")
    Page<DimensionAttributeValue> searchByCharValueAndFilter(
            @Param(value = "chrValueAttributeId") Long chrValueAttributeId, @Param(value = "lstAttributeId") Long lstAttributeId,
            @Param(value = "chrValue") String chrValue, @Param(value = "lstValue") Long lstValue, Pageable pageable);

AND (([..] 语句出现错误:'(', &lt;expression&gt;, FUNCTION or identifier expected, got '('

谁能帮我翻译一下这句话?谢谢!

【问题讨论】:

    标签: java sql spring-boot jpa jpql


    【解决方案1】:

    你有一个AND 和这些括号内比较器的一侧。

    您需要将结果与某物进行比较或添加存在:

    AND EXISTS ((
                SELECT TOP 1 StartDate FROM DimensionAttributeValue
                WHERE MasterData_ID = dav_n.MasterData_ID 
                  AND DimensionAttribute_ID = dav_n.DimensionAttribute_ID AND StartDate <= getdate()
                ORDER BY StartDate DESC
            ) = dav_n.StartDate OR dav_n.StartDate IS NULL)
    

    【讨论】:

    • 感谢您的快速回答,我仍然遇到错误。你能帮我纠正一下这个说法吗?我真的迷路了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 2017-07-12
    • 2020-05-27
    • 2014-02-06
    相关资源
    最近更新 更多