2017-10-06 151 views
0

所以,這裏是我的SQL原始查詢:麻煩重寫的SQL查詢到HQL查詢

SELECT  o.offering_number, 
     o.english_description, 
     o.french_description, 
     fop.price_amount, 
     fop2.price_amount, 
     fop.price_type_code, 
     fop.offering_id, 
     fop2.offering_id 
      from facility_offering_price fop 
      join offering o on fop.offering_id = o.offering_id 
      inner join 
       (select 
        fop1.offering_id, 
        fop1.price_amount 
          from facility_offering_price fop1 
          WHERE fop1.price_type_code = 5 
          AND fop1.price_status_code = 1 
       ) fop2 on fop.offering_id = fop2.offering_id 
       WHERE fop.price_start_date = '15-10-28' 
       AND fop.price_status_code IN (1,2) 
       /*AND (price_status_code IS NULL)*/ 
       AND fop.price_type_code = 5 
       /*AND (o.offering_number IS NULL)*/ 
        ORDER BY o.offering_number ASC, fop.price_sequence_number ASC; 

這裏是HQL上面的查詢:

@Query("SELECT new com.frontier.dto.productprice.PendingPriceProduct(" 
     + " fop.facilityPhysicalOffering.offeringNumber," 
     + " fop.facilityPhysicalOffering.offering.description.englishDescription," 
     + " fop.facilityPhysicalOffering.offering.description.frenchDescription," 
     + " fop.priceAmount," 
     + " fop2.priceAmount," 
     + " fop.priceStatusCode" 
     + ")" 
     + " from FacilityOfferingPrice fop" 
     + " INNER JOIN (SELECT fop1.offeringId, fop1.priceAmount FROM FacilityOfferingPrice fop1 WHERE " 
     + " fop1.id.priceTypeCode = com.frontier.domain.type.PriceType.REG_RETAIL_PRICE" 
     + " AND fop1.priceStatusCode = com.frontier.domain.type.OfferingPriceSts.CURRENT" + 
     ") fop2 on fop.offeringId = fop2.offeringId" 
     + " WHERE fop.priceStartDate = :priceStartDate" 
     + " AND fop.priceStatusCode IN (:priceStatusCodes)" 
     + " AND (:priceStatusCode IS NULL OR fop.priceStatusCode = :priceStatusCode)" 
     + " AND fop.id.priceTypeCode = com.frontier.domain.type.PriceType.REG_RETAIL_PRICE" 
     + " AND (:fromOfferingNumber IS NULL OR fop.facilityPhysicalOffering.offeringNumber >=:fromOfferingNumber)" 
     + " ORDER BY fop.facilityPhysicalOffering.offeringNumber ASC, fop.id.priceSequenceNumber ASC") 
List<PendingPriceProduct> findPendingPriceProducts(
     @Param("priceStartDate") LocalDate priceStartDate, 
     @Param("priceStatusCodes") List<OfferingPriceSts> priceStatusCodes, 
     @Param("priceStatusCode") OfferingPriceSts priceStatusCode, 
     @Param("fromOfferingNumber") Long fromOfferingNumber, 
     Pageable pageable); 

錯誤消息:意外的標記: (接近第1行,第372列) 因此,加入語法有些問題,在我用這個連接替換子查詢之前,這一切都很好。

我會感謝您的幫助

UPDATE:

新查詢:

@Query("SELECT " 
     + " new com.frontier.dto.productprice.PendingPriceProduct(" 
     + " fop.facilityPhysicalOffering.offeringNumber," 
     + " fop.facilityPhysicalOffering.offering.description.englishDescription," 
     + " fop.facilityPhysicalOffering.offering.description.frenchDescription," 
     + " fop.priceAmount," 
     + " fop1.priceAmount," 
     + " fop.priceStatusCode" 
     + ")" 
     + " from FacilityOfferingPrice fop" 
     + " INNER JOIN FacilityOfferingPrice fop1 on fop.offeringId = fop1.offeringId" 
     + " WHERE fop.priceStartDate = :priceStartDate" 
     + " AND fop.priceStatusCode IN (:priceStatusCodes)" 
     + " AND (:priceStatusCode IS NULL OR fop.priceStatusCode = :priceStatusCode)" 
     + " AND fop.id.priceTypeCode = com.frontier.domain.type.PriceType.REG_RETAIL_PRICE" 
     + " AND (:fromOfferingNumber IS NULL OR fop.facilityPhysicalOffering.offeringNumber >=:fromOfferingNumber)" 
     + " ORDER BY fop.facilityPhysicalOffering.offeringNumber ASC, fop.id.priceSequenceNumber ASC") 
List<PendingPriceProduct> findPendingPriceProducts(
     @Param("priceStartDate") LocalDate priceStartDate, 
     @Param("priceStatusCodes") List<OfferingPriceSts> priceStatusCodes, 
     @Param("priceStatusCode") OfferingPriceSts priceStatusCode, 
     @Param("fromOfferingNumber") Long fromOfferingNumber, 
     Pageable pageable); 

新的錯誤: 路徑預期的加入!`InvalidPathException:無效的路徑: 'fop1.priceAmount'

回答

0

我不知道你可以在HQL中這樣寫子查詢,順便說一句,你真的需要子查詢嗎?如果你重寫你的初始查詢那樣

SELECT  o.offering_number, 
     o.english_description, 
     o.french_description, 
     fop.price_amount, 
     fop1.price_amount, 
     fop.price_type_code, 
     fop.offering_id, 
     fop1.offering_id 
      from facility_offering_price fop 
      join offering o on fop.offering_id = o.offering_id 
      inner join facility_offering_price fop1 
       on fop.offering_id = fop1.offering_id 
     WHERE fop.price_start_date = '15-10-28' 
       AND fop.price_status_code IN (1,2) 
       /*AND (price_status_code IS NULL)*/ 
       AND fop.price_type_code = 5 
       /*AND (o.offering_number IS NULL)*/ 
       AND fop1.price_type_code = 5 
       AND fop1.price_status_code = 1 
     ORDER BY o.offering_number ASC, fop.price_sequence_number ASC; 

到HQL的轉換應該是非常簡單的。

+0

謝謝,那看起來不錯。我試着將它翻譯成HQL,但不斷收到錯誤。你能幫我換換嗎? –

+0

你會得到什麼錯誤? – StephaneM

+0

我已更新我的帖子。 –