У меня есть несколько запросов в одном интерфейсе 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')"
}
Это не работа, конечно, но, надеюсь, демонстрирует то, чего я пытаюсь достичь.