Вызов хранимой процедуры Hibernate отображает значения последовательно, а не по именам параметров - PullRequest
0 голосов
/ 03 мая 2018

Мы вызываем хранимую процедуру из спящего режима, используя следующий код:

ProcedureCall procedureCall = session.createStoredProcedureCall("StoredProcedureName", CustomEntity.class);

procedureCall.registerParameter("ParameterName1",String.class,ParameterMode.IN);
        procedureCall.getParameterRegistration("ParameterName1")
                .bindValue("Value1");
procedureCall.registerParameter("ParameterName2",String.class,ParameterMode.IN);
        procedureCall.getParameterRegistration("ParameterName2")
                .bindValue("Value2");

Здесь ожидается, что он должен сопоставлять параметры со значениями по имени. Но похоже, что он отображает значения последовательно. Потому что, если мы поставим условие, что если «значение» пусто, пропустите параметр регистра для этого значения. Таким образом, если мы пропустим какой-либо параметр между ними, он сопоставит значения своего следующего зарегистрированного параметра с этим пропущенным параметром.

Ex:

if (!value1.equals(""))
{
procedureCall.registerParameter("ParameterName1",String.class,ParameterMode.IN);
        procedureCall.getParameterRegistration("ParameterName1")
                .bindValue("Value1");
}

(это означает, что если мы получим «value1» пустым, мы пропустим регистрацию этого параметра, но в этом случае он будет отображать «value2» в «имя_параметра1")

Как этого можно избежать?

Заранее спасибо!

1 Ответ

0 голосов
/ 03 мая 2018

Я рекомендую вам вызывать вашу хранимую процедуру, используя аннотацию @NamedNativeQueries в вашем CustomEntity.class, например:

@NamedNativeQueries(
    {
        @NamedNativeQuery(
              name = "storedProcedureName",
              query = "EXEC StoredProcedureName :ParameterName1, :ParameterName2",
              resultClass = CustomEntity.class
        )
    }
)

Затем в классе вызывающих хранимых процедур вы можете создать метод, который получает HashMap <String, Object>, где вы будете помещать свои параметры в <name, value> кортежей. Помните, что вы должны поместить все параметры, если вам не нужен конкретный параметр в какой-либо ситуации, отправьте пустую строку или нулевое значение. Например, следующий метод:

public <T> List<T> execPAmultipleResults(String paNamedQuery, HashMap<String, Object> parameters) {
        NativeQuery nativeQuery = currentSession.getNamedNativeQuery(paNamedQuery);
        if (parameters != null) {
            Set<String> params = parameters.keySet();
            params.stream().forEach((param) -> {
                Object obj = parameters.get(param);
                nativeQuery.setParameter(param, obj);
            });
        }
        return nativeQuery.list();
    }

Вы можете отправить нулевое значение для аргумента HashMap при выполнении хранимой процедуры без входных параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...