【问题标题】:JPA native query to return the entity with fields from multiple tablesJPA 本机查询以返回具有来自多个表的字段的实体
【发布时间】:2013-09-30 11:12:28
【问题描述】:

我在 JPA NativeSql 中有一个查询,我在其中执行表和联接的“联合”。我用来自多个表的所有查询字段创建了一个实体。所以我不能像往常一样用 JPA 做“@Column”“@table”。

如何将查询的给定值设置为我的实体?

【问题讨论】:

    标签: java jpa


    【解决方案1】:

    您可以使用@SqlResultSetMapping 将本机 SQL 查询返回的列映射到您的实体。

    Example:

    Query q = em.createNativeQuery(
        "SELECT o.id AS order_id, " +
            "o.quantity AS order_quantity, " +
            "o.item AS order_item, " +
            "i.name AS item_name, " +
        "FROM Order o, Item i " +
        "WHERE (order_quantity > 25) AND (order_item = i.id)",
        "OrderResults");
    
    @SqlResultSetMapping(name="OrderResults", 
        entities={ 
            @EntityResult(entityClass=com.acme.Order.class, fields={
                @FieldResult(name="id", column="order_id"),
                @FieldResult(name="quantity", column="order_quantity"), 
                @FieldResult(name="item", column="order_item")
            })
        },
        columns={
            @ColumnResult(name="item_name")}
    )
    

    更多例子可以在here找到。

    【讨论】:

      【解决方案2】:

      您可以为此使用重载的EntityManager#createNativeQuery(sql,resultClass) 方法。

      【讨论】:

        【解决方案3】:

        为什么不把 NATIVE SQL 放到视图中呢?然后只需创建一个映射到视图的实体,就像任何普通实体映射到表一样。唯一的区别是您不能插入、更新或删除基于视图的实体。

        【讨论】:

        • 这是你想做的,实体,你有例子吗?
        • 在数据库中创建视图
        • 我做了一个带有注释“@ entity”的实体和与查询相关的变量。所以我做了,“Query query = manager.createNativeQuery(sql.toString(), Cep.class);”。现在设置pair aminha实体值的缺失部分返回。我希望是这样的:“List results = query.getResultList ();”
        【解决方案4】:

        恕我直言,将 DAO 与 JPA 结合使用并不是一个好主意。但是看看Criteria API。您可以像使用CriteriaBuilder 描述的那样构建此类查询。

        【讨论】:

        • 哎呀...没看过。你使用 EclipseLink 吗? EclipseLink 知道 Unions。
        【解决方案5】:

        JPA 本机 SQL 与通用 SQL 相同。你可以像SQL查询一样做union操作。但是,如果你想用JPQL来做,那么你需要使用EclipseLink,因为JPAJPQL不支持Union操作。

        【讨论】:

        • 对,不支持,所以使用原生查询,问题出在查询的返回上,我的实体怎么设置,字段同时来自多个表?
        猜你喜欢
        • 2011-10-16
        • 2011-01-09
        • 2017-05-23
        • 2015-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-31
        • 2019-12-22
        相关资源
        最近更新 更多