0

私はこのエンティティを持っています:

@Entity
@Table(name = "entry")
@SqlResultSetMapping(
    name = "viewEntry",
    entities =
    @EntityResult(entityClass = ViewEntry.class,
            fields = {
                    @FieldResult(name="id", column = "id"),
                    @FieldResult(name="guid", column = "guid"),
                    @FieldResult(name="link", column = "link"),
                    @FieldResult(name="descr", column = "descr"),
                    @FieldResult(name="pubDate", column = "pub_date"),
                    @FieldResult(name="read", column = "my_read")
            }
    )
)
public class ViewEntry implements Serializable {
    @Id
    private Integer id;
    private String guid;
    private String link;
    private String descr;
    private Date pubDate;
    @Transient
    private Boolean read;
}

フィールドreadは別のテーブルに存在するため、JPA マッピング エラーを防ぐために一時的にしました。エンティティのコンテンツを取得するには、次のようなネイティブ クエリを使用します。

select id,guid,link,descr,pub_date,feed_id,user_id,is_read as my_read from entry join user_to_entry ....
-- skipped dynamic part of query

問題は、ネイティブ クエリを自分のエンティティにマップする方法がわからないことです。特に、@Transient フィールドが EntityManager によって無視されるかどうかはわかりません。助けてください。

4

3 に答える 3

2

@SecondaryTableエンティティでを使用して、別のテーブルのフィールドをマップできます。このようなもの:

...
@SecondaryTable(name="user_to_entry", 
        pkJoinColumns=@PrimaryKeyJoinColumn(name="entry_id"))
public class ViewEntry implements Serializable {
    @Id
    private Integer id;
    private String guid;
    private String link;
    private String descr;
    @Column(name="pub_date")
    private Date pubDate;
    @Column(table = "user_to_entry")
    private Boolean read;
}

何らかの理由でそれができない場合は、ネイティブ SQL の結果を次のようにエンティティにマップできます。

em.createNativeQuery("<native SQL>", ViewEntry.class)

しかし、これが一時的なフィールドをマップするとは思いません(間違っている可能性があります。テストしていません)。

3 番目のオプションは を使用する@SqlResultSetMappingことですが、これが一時的なフィールドで機能するかどうかもわかりません。例としてこれを確認してください。

于 2015-04-03T09:06:09.340 に答える
2

ネイティブ クエリの結果をマップするには、SqlResultSetMapping http://docs.oracle.com/javaee/7/api/javax/persistence/SqlResultSetMapping.htmlを使用できます。

ネイティブ クエリの列が属性名と一致する場合、またはエンティティで @Column にマップされている場合、マッピングは必要ありません。

于 2015-04-03T09:01:16.433 に答える
0

最悪の場合、結合を使用してビューを作成し、通常のテーブルのようにビューをマップできます。休止状態が作成する新しいテーブルを削除するだけです。

https://www.w3schools.com/sql/sql_view.asp

于 2021-10-27T11:35:50.063 に答える