Совместное использование SQL между собственными запросами в Spring Data JPA - PullRequest
0 голосов
/ 18 июня 2020

У меня есть несколько запросов в одном интерфейсе Spring Data JPA Repository, который вызывает ту же функцию базы данных и присоединяется к одному и тому же набору таблиц. Единственное различие между запросами - это одна из объединяемых таблиц и один столбец, выбранный из этой объединяемой таблицы. Вот пример двух запросов:

   @Query(value = "SELECT m.managerCode, s.employeeID, s.FullName, "
            + "s.employeeType, v.propertyValue "
            + "FROM User.fSysFunction(:binData) a " 
            + "JOIN User.vEmployee s " 
            + "ON s.employeeID = a.employeeID " 
            + "JOIN App.vManager m "
            +  "ON a.ManagerID = m.ManagerID "
            + "LEFT OUTER JOIN App.vPropertyValue v "
            + "ON s.employeeID = v.employeeID " 
            + "  AND v.PropertyName = 'BinID' "             
            + "where s.employeeType in ('set', 'ft', 'rs', 'wtr', 'wlt', 'ma') ",
           nativeQuery = true)
    List<EmployeeManagerDto> getEmployeeManagerDtos(@Param("binData") byte[] binData);

   @Query(value = "SELECT m.supervisorCode, s.employeeID, s.FullName, " // select col different
            + "s.employeeType, v.propertyValue "
            + "FROM User.fSysFunction(:binData) a " 
            + "JOIN User.vEmployee s " 
            + "ON s.employeeID = a.employeeID " 
            + "JOIN App.vSupervisor m " // a different join here
            +  "ON a.SupervisorID = m.SupervisorID "
            + "LEFT OUTER JOIN App.vPropertyValue v "
            + "ON s.employeeID = v.employeeID " 
            + "  AND v.PropertyName = 'BinID' "             
            + "where s.employeeType in ('set', 'ft', 'rs', 'wtr', 'wlt', 'ma') ",
           nativeQuery = true)
    List<EmployeeSupervisorDto> getEmployeeSueprvisorDtos(@Param("binData") byte[] binData);

Я хотел бы избежать дублирования текста SQL между запросами. Как я могу это сделать?

Обновление

Вот что я пытаюсь выполнить sh:

 @Query(value = getQueryText("m.managerCode", "JOIN App.vManager m "
            +  "ON a.ManagerID = m.ManagerID "),
           nativeQuery = true)
    List<EmployeeManagerDto> getEmployeeManagerDtos(@Param("binData") byte[] binData);

 @Query(value = getQueryText("m.supervisorCode", "JOIN App.vSupervisor m"
            +  "ON a.SupervisorID = m.SupervisorID "),
           nativeQuery = true)
List<EmployeeSupervisorDto> getEmployeeSueprvisorDtos(@Param("binData") byte[] binData);

 default String getQueryText(selectColumnText, joinText) {
     return "SELECT " + selectColumnText + ", s.employeeID, s.FullName, " 
            + "s.employeeType, v.propertyValue "
            + "FROM User.fSysFunction(:binData) a " 
            + "JOIN User.vEmployee s " 
            + "ON s.employeeID = a.employeeID " 
            + joinText
            + "LEFT OUTER JOIN App.vPropertyValue v "
            + "ON s.employeeID = v.employeeID " 
            + "  AND v.PropertyName = 'BinID' "             
            + "where s.employeeType in ('set', 'ft', 'rs', 'wtr', 'wlt', 'ma')"
  }

Это не работа, конечно, но, надеюсь, демонстрирует то, чего я пытаюсь достичь.

1 Ответ

0 голосов
/ 18 июня 2020

Это может быть много вещей, необходимо знать ER базы данных, но это может быть потому, что в другой таблице есть две строки, которые образуют повторяющуюся строку, если каждый столбец имеет одинаковые данные, вы можете использовать GROUP BY и перечислить каждый столбец из выбранного, например

" GROUP BY p.supervisorCode, s.employeeID, s.FullName, s.employeeType, v.propertyValue "

Или, если база данных - SQL Server, вы можете просто использовать DISTINCT, как это

"SELECT distinct p.supervisorCode, s.employeeID, s.FullName, " 
            + "s.employeeType, v.propertyValue "...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...