简体   繁体   中英

Convert SQL to JPQL: INNER JOIN with SELECT

I have the following SQL statement for a really complex search for my spring boot backend. No I need to transfer this to JQPL for the search method within my repository.

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 are my search variables. The following listing is the code of my 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);

I get an error for the AND (([..] statement: '(', <expression>, FUNCTION or identifier expected, got '('

Can anyone help me to translate this statement? Thanks!

You have got an AND and one side of the comparator within those brackets.

You need to compare the result to something or add exists:

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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM