1

クラス 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 に列 'firstname' または 'lastname' がないことです。これらの列は、SQL 結合ステートメントからの結果セットにのみ存在します。また、ac_userdef_data テーブルにも存在しません。そこには、フィールド名と値の 2 つの列があります。および 2 行: fieldname = 'firstname' で値の列に値があり、別の行で fieldname = 'lastname' で値の列に値がある

マッピング ファイルを変更して、Hibernate が POJO の firstname および lastname フィールドに firstname および lastname 列をロードする必要があることを理解するようにしますが、これらの列は参照される ac_users テーブルに実際には存在しません。

4

1 に答える 1

1

私は今、いくつかの実用的なコードを持っています。その秘訣は、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> 

私のクエリ宣言

<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 に答える