当前位置: 首页 > 知识库问答 >
问题:

JPA条件API-设置连接并从连接的实体获取数据

茹正初
2023-03-14

我有两个实体foofooderiveddata,如下所述。

@Entity
@Table(name="FOO")
public class Foo {

// skipping property declarations

@OneToOne
@PrimaryKeyJoinColumn(name = "FOO_ID")
@Fetch(FetchMode.JOIN)
public getFooDerivedData() {
    return fooDerivedData;
}
@Entity
@Table(name = "FOO_DERIVED_VW")
@Immutable
public class FooDerivedData {

    @Id
    @Column(name = "FOO_ID")
    long fooId;

    @Column(name = "FOO_COUNT")
    private Integer fooCount;

    @Column(name = "FOO_SUM")
    private BigDecimal fooSum;


    // Getters left out here

我正在使用JPA标准API(Hibernate是JPA实现),我需要fooderiveddata实例加载到foo中。缺省情况下,这是急切地获取的,但我希望使用内部联接来获取,而不是为fooderiveddata的每个实例使用单独的select语句。我成功地添加了针对fooderiveddata的内部联接。

CriteriaQuery<Foo> criteriaQuery = criteriaBuilder.createQuery(Foo.class);
Root<Foo> root = criteriaQuery.from(Foo.class);
root.join("fooDerivedData");
Predicate p = getPredicate(); // details omitted here
criteriaQuery.select(root).where(p);

虽然我可以从日志中的SQL中看到为FOO_DERIVED_VW添加了内部联接,但没有选择任何列。对于foo的每个实例,我仍然需要有一个单独的select语句来获取我随时可用的数据

当前的查询如下所示:

select f.foo_id, f.foo_bar from from FOO f
inner join FOO_DERIVED_VW d on d.foo_id = f.foo_id;
select d.foo_id, d.foo_count, d.foo_sum from FOO_DERIVED_VW d where foo_id = ?;
select d.foo_id, d.foo_count, d.foo_sum from FOO_DERIVED_VW d where foo_id = ?;
select f.foo_id, f.foo_bar, d.foo_count, d.foo_sum from from FOO f
inner join FOO_DERIVED_VW d on d.foo_id = f.foo_id;
Root<Foo> root = criteriaQuery.from(Foo.class);
root.fetch("fooDerivedData");

原因:org.hibernate.QueryException:查询指定了联接提取,但提取的关联的所有者不在选择列表中

共有1个答案

符正信
2023-03-14

我觉得你有几个选择。如果where条件不使用连接表中的任何列,则尝试的提取应如下所示:

CriteriaQuery<Foo> criteriaQuery = criteriaBuilder.createQuery(Foo.class);
Root<Foo> root = criteriaQuery.from(Foo.class);
root.fetch("fooDerivedData");
Predicate p = getPredicate(); // details omitted here
criteriaQuery.select(root).where(p);

如果谓词确实包括来自联接表的列,那么您可以像以前那样联接(fetch目前对此不起作用),然后还可以通过将其添加到已有的内容中来指定动态实体图(从JPA2.1开始):

CriteriaQuery<Foo> criteriaQuery = criteriaBuilder.createQuery(Foo.class);
Root<Foo> root = criteriaQuery.from(Foo.class);
root.join("fooDerivedData");
Predicate p = getPredicate(); // details omitted here
criteriaQuery.select(root).where(p);
EntityGraph<Foo> fetchGraph = entityManager.createEntityGraph(Foo.class);
fetchGraph.addSubgraph("fooDerivedData");
EntityManager.createQuery(criteriaQuery).setHint("javax.persistence.loadgraph", fetchGraph);
 类似资料:
  • 问题内容: 我们有一个JPA应用程序(使用hibernate),我们需要将调用传递给需要JDBC数据库连接作为参数的旧式报告工具。有没有一种简单的方法可以访问hibernate已设置的JDBC连接? 问题答案: 您想在哪里获得该连接尚不清楚。一种可能是从.NET 使用的基础Hibernate中获取它。使用JPA 1.0,您必须执行以下操作: 请注意,该方法不是可移植的,此方法的结果特定于实现:上面

  • 我正在努力使用jpa Crudepository接口连接两个实体模型。我不知道如何映射两个实体模型并在@query注释中编写查询。这些是我的实体类。我想执行这个查询“从taxi\u driver\u映射中选择dppd.payment\u plan\u id,dppd.attribute\u value,dppd.attribute\u id作为tdm加入driver\u payment\u pla

  • 代码片段如下所示: 如果有人有决议,请帮忙?

  • 我正在尝试在建立Tcp连接后建立Udp连接。所有连接状态和控制都通过Tcp进行,但我希望客户端和服务器也能够通过Udp进行通信。这是我的问题。 服务器将有许多客户端在单独的线程上连接到它。我让它 0 在仅绑定 Tcp 的情况下工作正常,但我想使用 Udp。由于 Udp 打孔,我很难侦听 Udp 上的特定endpoint,因为endpoint在与 NAT 设备通信时可能会发生变化。 因此,简单地提出

  • 我正在使用Azure设备预配服务(DPS)自动向Azure IoT中心注册和预配设备。 我想得到一个特定设备的孪生设备。 我可以通过使用de DeviceClient类来管理设备双胞胎: 但是我想通过使用RegistryManager获取设备,它需要特定IoTHub的连接字符串。 是否可以从DPS、连接的设备或IoT中心名称(即结果)中获取IoT中心连接字符串。AssignedHub)?我正在使用

  • 我使用API条连接OAuth参考(https://stripe.com/docs/connect/standard-accounts) 重定向用户的链接是:https://connect.stripe.com/oauth/authorize?response_type=code 如何翻译此页面?我尝试在url:但不起作用。我在留档中找不到任何东西谢谢