Hibernate - Новые столбцы из объединенного стола - PullRequest
1 голос
/ 06 февраля 2009

У меня есть класс объекта User. Я пытаюсь загрузить этот объект из базы данных с помощью Hibernate. Мой оператор SQL:

SELECT
    users.uid               AS uid,
    users.deleted           AS deleted,
    users.username          AS username,
    users.passwd            AS passwd,
    users.disabled          AS disabled,
    users.lockout           AS lockout,
    users.expires           AS expires,
    data_firstname.value            AS firstname,
    data_lastname.value     AS lastname 
FROM 
    ac_users as users
LEFT JOIN
    ac_userdef_data as data_firstname
ON
    users.uid = data_firstname.parentuid AND
    data_firstname.fieldname like 'firstname'
LEFT JOIN
    ac_userdef_data as data_lastname
ON
    users.uid = data_lastname.parentuid AND
    data_lastname.fieldname like 'lastname'
WHERE
    users.deleted = 0

Мое сопоставление для класса User:

<class name="com.agetor.commons.security.User" table="ac_users">
    <id name="uid" column="uid" type="long" >
        <generator class="native"/>
    </id>
    <property name="deleted" column="deleted" />
    <property name="username" column="username" />   
    <property name="password" column="passwd" />
    <property name="firstname" column="firstname" />
    <property name="lastname" column="lastname" />
    <property name="disabled" column="disabled" />
    <property name="lockout" column="lockout" />
    <property name="expires" column="expires" />            
</class> 

Моя проблема в том, что таблица ac_users не имеет столбца «имя» или «фамилия» Эти столбцы существуют только в моем наборе результатов из оператора SQL-join. Они также не существуют в таблице ac_userdef_data. Там у меня есть 2 столбца: имя поля и значение. и 2 ряда: fieldname = 'firstname' с некоторым значением в столбце значений и еще один ряд с fieldname = 'lastname' с некоторым значением в столбце значений

Как изменить файл сопоставления, чтобы Hibernate понимал, что ему нужно загрузить столбец имени и фамилии в поля моего имени и фамилии в моем POJO, в то время как эти столбцы фактически не существуют в указанной таблице ac_users. 1009 *

Ответы [ 2 ]

1 голос
/ 06 февраля 2009

Теперь у меня есть рабочий код. Хитрость заключалась в том, чтобы указать загрузочный запрос для класса User. Затем Hibernate проверяет результат возврата из запроса вместо схемы таблицы.

Класс сопоставления

<class name="com.agetor.commons.security.User" table="ac_users">
    <id name="uid" column="uid" type="long" >
        <generator class="native"/>
    </id>
    <property name="deleted" column="deleted" />
    <property name="username" column="username" />   
    <property name="password" column="passwd" />
    <property name="firstname" column="firstname" />
    <property name="lastname" column="lastname" />
    <property name="disabled" column="disabled" />
    <property name="lockout" column="lockout" />
    <property name="expires" column="expires" />                 


    <loader query-ref="GetAllUsers" />
</class> 

Объявление My Query

<sql-query name="GetAllUsers">
  <return alias="user" class="com.agetor.commons.security.User" />
  <![CDATA[ 
    SELECT
        users.uid               AS uid,
        users.deleted           AS deleted,
        users.username          AS username,
        users.passwd            AS passwd,
        users.disabled          AS disabled,
        users.lockout           AS lockout,
        users.expires           AS expires,
        data_firstname.value    AS firstname,
        data_lastname.value     AS lastname 
    FROM 
        ac_users as users
    LEFT JOIN
        ac_userdef_data as data_firstname
    ON
        users.uid = data_firstname.parentuid AND
        data_firstname.fieldname like 'firstname'
    LEFT JOIN
        ac_userdef_data as data_lastname
    ON
        users.uid = data_lastname.parentuid AND
        data_lastname.fieldname like 'lastname'
    WHERE
        users.deleted = 0
  ]]>
</sql-query> 

Мне пришлось использовать строку <return alias="user" class="com.agetor.commons.security.User" />, чтобы возвращаемая коллекция была набрана правильно

0 голосов
/ 18 февраля 2009

Решение этого вопроса такое же, как и на мой другой вопрос. Так что я ссылаюсь на него здесь и принимаю ответ.

Однонаправленный Hibernate один-ко-многим в существующей БД

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