Основные проблемы Hibernate с использованием и SQL-запрос - PullRequest
1 голос
/ 16 мая 2010

У меня есть Java-объект Person с 3 свойствами firstname, lastname и username.

У меня есть хранимая процедура Oracle, возвращающая набор результатов с 3 столбцами. Все отлично работает для этого.

Теперь у меня есть другая хранимая процедура, которая будет возвращать только имя и фамилию, но не имя пользователя.

Я получаю следующую ошибку:

Не удалось прочитать значение столбца из результирующего имени пользователя

Hibernate пытается извлечь свойство имени пользователя из набора результатов. Если я удаляю свойство username, то оно работает.

Моя конфигурация:

<sql-query name="normalise" callable="true" >
<return alias="val" class="com.nbfg.sipc.model.Person">
<return-property name="firstname" column="FIRST_NAME"/>
<return-property name="lastname" column="LASTNAME_NAME"/>
</return>
{call SCHSIPC.PKG_SIPC_APP.PRC_SIPC_NORMALISE_RS(?, ?, ?, ?, ?) }
</sql-query>

My Pojo (без аннотации)

@Entity
public class Person {

    private String firstname;
    private String lastname;
    private String username;
...

Звонок:

private Value call(String app, String cat, String col, String valeure, String query) {
    try {
        Query q = getSessionFactory().openStatelessSession().getNamedQuery(query);
        q.setString(0, app).setString(1, cat).setString(2, col).setString(3, valeure);
        return (Person) q.list().get(0);
    } catch (org.hibernate.QueryTimeoutException ex) {
        throw new IllegalArgumentException(ex.getCause().getMessage());
    }
}

Все работает нормально, если я уберу свойство username из моего Pojo. Могу ли я использовать тот же PoJo?

Спасибо

Ответы [ 2 ]

2 голосов
/ 16 мая 2010

Спасибо за код. Я не уверен на 100% в этом, но я считаю, что в Hibernate SQL-запросы должны возвращать все поля объекта, экземпляр которого вы хотите создать.

Альтернативное решение, которое вы можете попробовать, - это полагаться на HQL и создавать экземпляр объекта по мере необходимости. Например, ВЫБЕРИТЕ нового Person (firstName, lastName) из Person p, где p.username = ... Это фактически позволяет вам использовать любой тип (с полями соответствующих типов) в ваших запросах.

Это решит вашу непосредственную проблему, но я не уверен, как решить проблему использования хранимых процедур в этом сценарии. Надеюсь это поможет.

0 голосов
/ 17 мая 2010

Хорошо, если мы говорим, что Hibernate не может читать только определенные столбцы в результате ResultSet, возвращаемого StoreProcedur, и что мне нужно создать отдельный POJO для каждого типа результирующего набора, тогда это ответ ,

Если это правильно?

...