0

ユーザーが通知オプションを設定できるようにするシステムとして書いています。Notification と NotificationOption の 2 つのクラスを作成しました。通知は、通知が送信されるさまざまなイベントとデフォルト値を指定するものであり、通知オプションにはユーザーが選択した設定が含まれます。これらは hbm ファイルです:

通知.hbm

<hibernate-mapping>
    <class name="com.entities.Notification" table="engine_notification">
        <id name="id">
            <generator class="sequence">
                <param name="sequence">seq_engine_notification_id</param>
            </generator>
        </id>

        <property name="name" not-null="true"/>
        <property name="descriptor" not-null="true"/>
        <property name="defaultValue" column="default_value"/>
    </class>
</hibernate-mapping>

NotificationOption.hbm

<hibernate-mapping>
    <class name="com.entities.NotificationOption" table="engine_notification_option">
        <composite-id>
           <key-many-to-one name="player"
                     class="com.entities.Profile"
                     foreign-key="id"
                     lazy="false" />
           <key-many-to-one name="notification"
                     class="com.entities.Notification"
                     foreign-key="id"
                     lazy="false" />
       </composite-id>
        <property name="value" not-null="true"/>
    </class>
</hibernate-mapping>

新しい通知タイプが作成されるたびに NotificationOption テーブルに行を作成する必要がなくなったので、Notification.id = NotificationOption.notification の NotificationOption を LEFT JOIN する Notification テーブルでクエリを実行できるようにしたいと考えています。 .

次の SQL を使用すると、期待どおりの結果が得られます。

SELECT * FROM engine_notification n
LEFT JOIN 
  (SELECT o.* FROM engine_notification_option o WHERE o.player = :playerid) nop
ON n.ID = nop.notification
ORDER BY n.ID;

そこで、hbm ファイルに以下を追加しました。

<sql-query name="notificationsForPlayer">
    <return alias="option" class="com.otto.engine.entities.NotificationOption"/>
    <return-join alias="notification" property="option.notification" />
    select
        n.id as {notification.id},
        n.name as {notification.name},
        n.descriptor as {notification.descriptor},
        n.default_Value as {notification.defaultValue},
        nop.player as {option.player},
        nop.value as {option.value}
    from engine_notification n
    left join (select o.* from engine_notification_option o where o.player = :playerID) nop
    on n.id = nop.notification
    order by n.ID
</sql-query>

ただし、これにより次のことがわかります。

java.sql.SQLException: Invalid column name

それを修正する方法、または私が達成しようとしていることを達成するための別の解決策はありますか?

ありがとう

4

1 に答える 1

0

select o.*結合に問題があると思います。この種の結合は実際には標準的ではありません。

この選択はどうですか:

select
    n.id as {notification.id},
    n.name as {notification.name},
    n.descriptor as {notification.descriptor},
    n.default_Value as {notification.defaultValue},
    nop.player as {option.player},
    nop.value as {option.value}
from engine_notification n
left join engine_notification_option nop
on n.id = nop.notification
where nop.player = :playerID
order by n.ID
于 2012-05-04T16:43:13.050 に答える