Рассмотрим следующий пример старого SQL-запроса в Java:
(мне пришлось санировать это, поэтому он может не скомпилироваться).
Connection con = null;
PreparedStatement stmt = null;
ResultSet result = null;
String whereClause = null;
whereClause = getWhereClause(clientSearch);
List l = new ArrayList();
int nextParam = 1;
boolean isPreClient = false;
String sql = "SELECT c." + CL_CLIENT_USER_ID + ",u." + US_FIRST_NM +
",u." + US_LAST_NM + ",u." + US_SSN + ",c." + CL_APP_SITE_CD +
",c." + CL_SYS_USER_ID + ",c." + CL_APP_USER_TYP_CD +
",c." + CL_PREREG_CMPL_CD +
",c." + CL_SPC_CAT_CD +
",c." + CL_REENLISTED_CD +
",u." + US_EMAIL_ADDR_TX +
",c." + CL_SPECIAL_PROGRAM_CD +
" FROM " + DBT_APP_USERS + " u," + DBT_APP_CLIENT + " c " +
whereClause +
" ORDER BY " + US_LAST_NM + "," + US_FIRST_NM;
try {
con = DbHelper.getConnection();
stmt = con.prepareStatement(sql);
if (clientSearch.isActive()) {
stmt.setInt(nextParam, ConstantsDB.ACTIVE);
nextParam++;
stmt.setInt(nextParam, ConstantsDB.MODIFIED);
nextParam++;
} else {
stmt.setInt(nextParam, ConstantsDB.INACTIVE);
nextParam++;
}
...
result = stmt.executeQuery();
while (result.next()) {
isPreClient = getIsPreClient(result.getInt(1), result);
l.add(new ClientListVO(result.getInt(1), forJava(result.getString(2)),
forJava(result.getString(3)), forJava(result.getString(4)), result.getInt(5),
result.getInt(6), result.getInt(7), result.getDate(8),
result.getDate(9), forJava(result.getString(10)), result.getDate(11), null,
result.getInt(12));
}
...
private String getWhereClause(ClientSearchVO clientSearch) {
String whereClause;
if (clientSearch.isActive()) {
whereClause = " WHERE u." + US_SYS_USER_ID + "=c." + CL_SYS_USER_ID
+ " AND c." + CL_ELMT_STATUS_CD + " IN (?,?)";
} else {
whereClause = " WHERE u." + US_SYS_USER_ID + "=c." + CL_SYS_USER_ID
+ " AND c." + CL_ELMT_STATUS_CD + "=?";
}
if (clientSearch.getSsnFull() != null) {
whereClause = whereClause + " AND u." + US_SSN + "=?";
}
if (clientSearch.isSearchPrereg()) {
whereClause = whereClause
+ " AND LENGTH(U." + US_SSN + ")=?";
}
if (clientSearch.getSsnLastFour() != null) {
whereClause = whereClause + " AND (substr(u." + US_SSN + ",6,4)=? OR u."
+ US_SSN + "=?)";
}
if (clientSearch.getLastName() != null) {
whereClause = whereClause + " AND UPPER(u." + US_LAST_NM + ") like ?";
}
if (clientSearch.getClientId() > 0) {
whereClause = whereClause + " AND c." + CL_CLIENT_USER_ID + "=?";
}
return whereClause;
}
Мне нужно преобразовать этовид кода для более нового приложения.Я использую версию 1.5x Spring Data JPA, Spring Boot и т. Д. Я не могу перейти на Spring Boot 2, потому что в настоящее время у меня нет доступа к более новым версиям сервлетов.
ВышеКод предназначен для экрана поиска, который ищет и извлекает данные из таблиц базы данных APP_CLIENT и APP_USERS.Я не уверен, что с этим делать, из-за того, что предложение WHERE создается как таковое.
Я думал о том, чтобы сделать что-то вроде этого:
public class ClientSearchResult {
protected AppClient client;
protected AppUsers user;
public ClientSearchResult(AppClient client, AppUsers user) {
this.client = client;
this.user = user;
}
...deligate methods
}
public interface AppClientRepo extends JpaRepository<AppClient, Long> {
@Query("SELECT new ClientSearchResult(au, ac) FROM AppUsers au, AppClient ac "
+ "WHERE "
+ "ORDER BY au.lastNm, au.firstNm ")
List<ClientSearchResult> findBySearchCriteria(@Param("someParam01") long someParam01, @Param("someParam02") String someParam02);
}
Я не уверенчто делать с предложением WHERE, однако.Если кто-то знает хороший способ превратить такой код в более современный подход, я хотел бы услышать об этом.Простой метод предпочтителен, но не обязателен.