Собственный запрос, сделайте условие WHERE условным, если параметр равен нулю или пуст - PullRequest
0 голосов
/ 26 февраля 2020

У меня проблема с моим запросом в приложении весенней загрузки / angular, использующем @ Query.

@Query(value =" SELECT "
            + " flow.ID, "
            + " min(flow.CONTEXTTIMESTAMP) contextTime,  "
            + " state.LOGROLE, "
            + " trait.ETAT, "
            + " CONCAT(' ',CONCAT(ac.NAME, CONCAT('=',ac.VALUE))) as idf "
            + "FROM "
            + "FLOW flow "
            + "INNER JOIN LOG trc ON flow.ID= trc.ID"
            + "INNER JOIN APPLICATION ac ON flow.ID= ac.ID"
            + "LEFT OUTER JOIN PROCESS trait ON flow.ID= trait.ID"
            + "LEFT OUTER JOIN STATE state ON flow.ID= state.ID"
            + "WHERE  "
            +" flow.FLOWCODE = ?3 "
            + "AND flow.CONTEXTTIMESTAMP BETWEEN ?1 AND ?2 "
            + "AND  CONCAT(' ',CONCAT(ac.NAME, CONCAT('=',ac.VALUE))) = ?4  "
            + "AND trait.etat = ?5 "
            + "AND trc.LOGROLE =  ?6  "
            + "GROUP BY "  
            + "flow.ID, "
            + "state.LOGROLE, "
            + "trait.ETAT, " 
            + "ac.NAME, " 
            + "ac.VALUE "
            + "ORDER BY  " + " contextTime desc, flow.ID, idf ", nativeQuery = true)
            public  List <FlowDto> fetchAllProcessContextWithCriteria(
            String startDate, String endDate, String flowCode,String idf,  String etat, String status );

В некоторых случаях некоторые параметры моего метода могут быть нулевыми или пустыми, поскольку они приходят из моей angular формы. Я хотел бы проигнорировать предложение WHERE для этих параметров, если они пустые или нулевые (например, idf или status), не могу сделать это на самом деле.

Кстати, если у вас есть идея или совет оптимизировать запрос, я буду рад услышать:)

Всем хорошего дня.

1 Ответ

0 голосов
/ 26 февраля 2020

Я не уверен, но вы можете попробовать что-то вроде этого.

(flow.FLOWCODE =? 3 ИЛИ? 3 НУЛЬ)

@Query(value =" SELECT "
        + " flow.ID, "
        + " min(flow.CONTEXTTIMESTAMP) contextTime,  "
        + " state.LOGROLE, "
        + " trait.ETAT, "
        + " CONCAT(' ',CONCAT(ac.NAME, CONCAT('=',ac.VALUE))) as idf "
        + "FROM "
        + "FLOW flow "
        + "INNER JOIN LOG trc ON flow.ID= trc.ID"
        + "INNER JOIN APPLICATION ac ON flow.ID= ac.ID"
        + "LEFT OUTER JOIN PROCESS trait ON flow.ID= trait.ID"
        + "LEFT OUTER JOIN STATE state ON flow.ID= state.ID"
        + "WHERE  "
        +" (flow.FLOWCODE = ?3 OR ?3 IS NULL) "
        + "AND flow.CONTEXTTIMESTAMP BETWEEN ?1 AND ?2 "
        + "AND  CONCAT(' ',CONCAT(ac.NAME, CONCAT('=',ac.VALUE))) = ?4  "
        + "AND ( trait.etat = ?5 OR ?5 IS NULL)"
        + "AND ( trc.LOGROLE = ?6 OR ?6 IS NULL)"
        + "GROUP BY "  
        + "flow.ID, "
        + "state.LOGROLE, "
        + "trait.ETAT, " 
        + "ac.NAME, " 
        + "ac.VALUE "
        + "ORDER BY  " + " contextTime desc, flow.ID, idf ", nativeQuery = true)
        public  List <FlowDto> fetchAllProcessContextWithCriteria(
        String startDate, String endDate, String flowCode,String idf,  String etat, String status );

Удачи!

...