40

我目前正在使用 Eclipselink,但我知道现在大多数 JPA 实现已经非常标准化。是否有将 JPA 实体映射到视图的本地方法?我不打算插入/更新,但问题实际上是如何处理 @Id 注释。JPA 世界中的每个实体都必须有一个 ID 字段,但是我创建的许多视图并不符合这一点。JPA 中是否有对此的本机支持,或者我是否需要使用 hack 来使其工作?我进行了很多搜索,但发现有关执行此操作的信息很少。

4

4 回答 4

8

虽然将@Id注释与直接支持的类型的字段一起使用并不是指定实体身份的唯一方法(参见@IdClasswith multiple @Idannotations 或@EmbeddedIdwith @Embedded),但 JPA 规范要求每个实体都有一个主键。

也就是说,您不需要实体将 JPA 与数据库视图一起使用。由于从 SQL 角度映射到视图与映射到表没有什么不同,因此您仍然可以使用本机查询 ( createNativeQueryon EntityManager) 来检索标量值。

于 2009-03-13T22:02:00.707 回答
0

我自己一直在研究这个,我发现了一个我不是 100% 确定的作品,但看起来很有希望。

在我的例子中,我在视图中有一个 FK 列,它可以有效地充当 PK - 该外来对象的任何给定实例只能在视图中出现一次。我从一个字段中定义了两个对象:一个被指定为 ID,代表字段的原始值,另一个被指定为只读,代表被引用的对象。


@Id
@Column(name = "foreignid", unique = true, nullable = false)
public Long getForeignId() {
...

@OneToOne
@JoinColumn(name = "foreignid", insertable=false, updatable=false)
public ForeignObject getForeignObject() {
...

就像我说的那样,我不能 100% 确定这个答案(如果结果不起作用,我会删除这个答案),但它让我的代码超过了一个特定的崩溃点。

不过,不知道它是否适用于您的具体情况。而且很有可能在 11 个月后,您不再关心。:-) 什么鬼,“死灵法师”徽章不只是靠自己挣来的……

于 2010-02-04T22:57:52.093 回答
0

在我看来,我有一个“唯一”的 id,所以我将它映射为实体 id。它工作得很好:

@Entity
@Table(name="table")
@NamedQuery(name="Table.findAll", query="SELECT n FROM Table n")
public class Table implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="column_a")
    private int columnA;
于 2015-12-07T13:56:31.967 回答
0

JPA - 2.5.4

    CREATE MATERIALIZED VIEW IF NOT EXISTS needed_article as select  product_id, count(product_id) as count from product_article group by product_id;
    CREATE MATERIALIZED VIEW IF NOT EXISTS available_article as select product_id, count(product_id) as count from article a inner join  product_article p
                                on  a.id = p.article_id and a.stock >= p.amount_of group by product_id;
    
    CREATE UNIQUE INDEX productId_available_article ON available_article (product_Id);
    CREATE UNIQUE INDEX productId_needed_article ON needed_article (product_Id);

实体.java

@Entity
@Immutable // hibernate import
@Getter
@Setter
public class NeededArticle {
    @Id
    Integer productId;
    Integer count;
}

存储库.java

@Repository
public interface AvailableProductRepository extends CrudRepository<AvailableArticle, Integer> {

    @Query("select available.productId from AvailableArticle available, NeededArticle needed where available.productId = needed.productId and available.count = needed.count")
    List<Integer> availableProduct();
于 2021-09-14T09:00:00.813 回答