1

我有一个类用户对象。我正在尝试使用 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 没有列 'firstname' 或 'lastname' 这些列仅存在于我的 SQL-join 语句的结果集中。它们也不存在于 ac_userdef_data 表中。我有 2 个列:字段名和值。和 2 行: fieldname = 'firstname' 在 value 列中有一些值,另一行 fieldname = 'lastname' 在 value 列中有一些值

如何更改我的映射文件,以便 Hibernate 了解它需要将名字和姓氏列加载到我的 POJO 上的名字和姓氏字段中,而这些列实际上并不存在于引用的 ac_users 表中。

4

1 回答 1

1

我现在有一些工作代码。诀窍是为 User 类指定一个加载查询。Hibernate 然后根据 Query 而不是 Table 设计的返回来验证。

类映射

<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> 

我的查询声明

<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" />才能正确键入返回的集合

于 2009-02-06T13:04:26.170 回答