【问题标题】:Hibernate - New colums from a joined table [duplicate]Hibernate - 连接表中的新列[重复]
【发布时间】:2010-10-05 22:11:59
【问题描述】:

我有一个类用户对象。我正在尝试使用 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' 在值列中有一些值 和另一排 fieldname = 'lastname' 在值列中有一些值

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

【问题讨论】:

    标签: sql hibernate mapping


    【解决方案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> 
    

    我必须使用行 &lt;return alias="user" class="com.agetor.commons.security.User" /&gt; 以便正确键入返回的集合

    【讨论】:

    • 这个答案不是 100% 正确的。我可以使用 users = (List) session.getNamedQuery("GetAllUsers").list(); 加载数据但我不能使用 users = session.createCriteria(User.class).list();
    猜你喜欢
    • 2016-03-09
    • 1970-01-01
    • 2015-02-04
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    相关资源
    最近更新 更多