недопустимый тип столбца ~ Отправка ArrayList <String>в pl / sql creationNameQuery - PullRequest
5 голосов
/ 02 августа 2011

Это относится к моему прошлому вопросу .

Я получаю List<Employee> и собираю идентификаторы из Employee объектов и помещаю их в ArrayList<String>, а затем отправляю ArrayList в качестве параметра в createdNameQuery. Я получаю недопустимое исключение типа столбца sql. Я проверил запрос в pl / sql developer и он вернул поля. Я пытался создать строку идентификаторов, помещая кому-либо между каждым идентификатором и отправляя его, но я получил исключение из этой попытки. Мне любопытно, если я неправильно настроил запрос или неправильно отправляю данные.

функция в моем хранилище:

public List<RequestByRequester> getRequestsByRequesters(
        List<Employee> employeeList) 
        throws NoDataFoundException {

    List<String> idList = new ArrayList<String>();
    for(Employee emp : employeeList) {          
        idList.add(emp.getId().toString());
    }

    log.debug("Input params[requesters=" + idList + "]");

    List<RequestByRequester> resultList = getEm().createNamedQuery(
            "requestByRequestor.getRequestsByRequesters", RequestByRequester.class)
            .setParameter(1,idList)
            .getResultList();

        if(resultList == null || resultList.size() <= 0)
            throw new NoDataFoundException("No requests found by requesters.");
        else
            return resultList;
}

Мой именованный запрос requestByRequestor.getRequestsByRequesters ниже:

   @NamedNativeQuery(
    name = "requestByRequestor.getRequestsByRequesters",
    resultClass = RequestByRequester.class,
    query = "SELECT EMP.EMPL_FIRST_NAME || ' ' || EMP.EMPL_LAST_NAME REQUESTER," +
            "       R.RQST_ID RQST_ID," +
            "       R.TITLE TITLE," +
            "       R.DESCRIPTION DESCRIPTION," +
            "       DECODE(R.RESOLUTION_DATE, NULL, 'Open', 'Closed') STATUS" +
            "  FROM TARTS.REQUESTS R, SYS_EMPLOYEES EMP" +
            " WHERE R.EMPL_ID_REQUESTED_BY = EMP.EMPL_ID" +
            "   AND EMP.EMPL_ID IN (?)" +
            " ORDER BY 1, 5 DESC, 2"
    )

РЕДАКТИРОВАТЬ: Добавление исключений в соответствии с просьбой.

Это исключение при использовании :ids в запросе:

Internal Exception: java.sql.SQLException: Missing IN or OUT parameter at index:: 1 Error Code: 17041 Call: SELECT EMP.EMPL_FIRST_NAME || ' ' || EMP.EMPL_LAST_NAME REQUESTER, R.RQST_ID RQST_ID, R.TITLE TITLE, R.DESCRIPTION DESCRIPTION, DECODE(R.RESOLUTION_DATE, NULL, 'Open', 'Closed') STATUS FROM TARTS.REQUESTS R, SYS_EMPLOYEES EMP WHERE R.EMPL_ID_REQUESTED_BY = EMP.EMPL_ID AND EMP.EMPL_ID IN :ids ORDER BY 1, 5 DESC, 2 Query: ReadAllQuery(name="requestByRequestor.getRequestsByRequesters" referenceClass=RequestByRequester sql="SELECT EMP.EMPL_FIRST_NAME || ' ' || EMP.EMPL_LAST_NAME REQUESTER, R.RQST_ID RQST_ID, R.TITLE TITLE, R.DESCRIPTION DESCRIPTION, DECODE(R.RESOLUTION_DATE, NULL, 'Open', 'Closed') STATUS FROM TARTS.REQUESTS R, SYS_EMPLOYEES EMP WHERE R.EMPL_ID_REQUESTED_BY = EMP.EMPL_ID AND EMP.EMPL_ID IN :ids ORDER BY 1, 5 DESC, 2")

Исключение при использовании ?1 или (?) в запросе:

Internal Exception: java.sql.SQLException: Invalid column type Error Code: 17004 Call: SELECT EMP.EMPL_FIRST_NAME || ' ' || EMP.EMPL_LAST_NAME REQUESTER, R.RQST_ID RQST_ID, R.TITLE TITLE, R.DESCRIPTION DESCRIPTION, DECODE(R.RESOLUTION_DATE, NULL, 'Open', 'Closed') STATUS FROM TARTS.REQUESTS R, SYS_EMPLOYEES EMP WHERE R.EMPL_ID_REQUESTED_BY = EMP.EMPL_ID AND EMP.EMPL_ID IN ? ORDER BY 1, 5 DESC, 2 bind => [[2192, 632]] Query: ReadAllQuery(name="requestByRequestor.getRequestsByRequesters" referenceClass=RequestByRequester sql="SELECT EMP.EMPL_FIRST_NAME || ' ' || EMP.EMPL_LAST_NAME REQUESTER, R.RQST_ID RQST_ID, R.TITLE TITLE, R.DESCRIPTION DESCRIPTION, DECODE(R.RESOLUTION_DATE, NULL, 'Open', 'Closed') STATUS FROM TARTS.REQUESTS R, SYS_EMPLOYEES EMP WHERE R.EMPL_ID_REQUESTED_BY = EMP.EMPL_ID AND EMP.EMPL_ID IN ? ORDER BY 1, 5 DESC, 2")

Ответы [ 4 ]

2 голосов
/ 03 августа 2011

Проблема (я думаю, потому что вы не включили определение вашего именованного запроса) в том, что вы выполняете собственный запрос SQL, а список не является допустимым значением параметра SQL / JDBC.

EclipseLink поддерживает параметры списка для запросов JPQL, но не для собственных запросов SQL.

Вам нужно либо использовать JPQL, либо определить каждый из параметров в вашем SQL

т.е.

EMP.EMPL_ID IN (:id1, :id2, :id3)

.setParameter("id1", idList.get(0));
.setParameter("id2", idList.get(1));
0 голосов
/ 02 августа 2011

Запрос:

List<RequestByRequester> resultList = getEm().createNamedQuery(
    "requestByRequestor.getRequestsByRequesters", RequestByRequester.class)
    .setParameter("ids", idList)
    .getResultList();

NamedQuery WHERE часть:

WHERE R.EMPL_ID_REQUESTED_BY = EMP.EMPL_ID
AND EMP.EMPL_ID IN :ids

Обратите внимание, что :ids без скобок. Это должно работать.

0 голосов
/ 02 августа 2011

В вашем коде вы отображаете emp.getId () в String

List<String> idList = new ArrayList<String>();
    for(Employee emp : employeeList) {          
        idList.add(emp.getId().toString());
    }

Но я держу пари, что тип для этого столбца EMP.EMPL_ID - Numeric или что-то подобное.При выполнении

.setParameter("empIds", idList)

JPA преобразует его в строковое значение с кавычками и escape-символами и т. Д., Следовательно:

java.sql.SQLException: неверный тип столбца

попробуйте сопоставить List<Long> или другой числовой тип.

0 голосов
/ 02 августа 2011

Я думаю, что проблема здесь

AND EMP.EMPL_ID IN (?)

Чтобы указать позиционные параметры, вам нужно добавить суффикс вопросительного знака к номеру.

 AND EMP.EMPL_ID IN (?1)

В качестве альтернативы вы можете сделать

 AND EMP.EMPL_ID IN (:empIds) 

и затем назовите ваш запрос так:

List<RequestByRequester> resultList = getEm().createNamedQuery(
        "requestByRequestor.getRequestsByRequesters", RequestByRequester.class)
        .setParameter("empIds", idList)
        .getResultList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...