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

将一对多关系映射到jOOQ中的记录列表

彭俊智
2023-03-14

我使用的是MySQL 5.7,我想将具有一对多关系的查询映射到其代表性记录的列表。

MySQL不支持多集,JSON仿真也不起作用,因为它无法在两个层次上引用别名。

我想知道是否有另一种方法可以让我尝试在一个查询中映射多个关系。

record BulkContactEdit(long id, String organizationName, List <Contact> contacts) {}

record Contact(long id) {}

var bce = BULK_CONTACT_EDIT.as("bce");
var bceContacts = BULK_CONTACT_EDIT_CONTACTS.as("bceContacts");

var record =
    jooq()
    .select(
        bce.ID,
        bce.ORGANIZATION_NAME,
        DSL.multiset(
            jooq().select(RELATION.ID)
            .from(RELATION)
            .where(RELATION.ID.eq(bceContacts.CONTACT_ID)))
        .as("contacts")
        .convertFrom(r - > r.map(mapping(Contact::new))))
    .from(
        bce
        .join(bceContacts)
        .on(bceContacts.BULK_CONTACT_EDIT_ID.eq(bce.ID)))
    .where(bce.ID.eq(Long.parseLong(content)));
.fetchOne(Records.mapping(BulkContactEdit::new));
select
  `bce`.`id`,
  `bce`.`organizationName`,
  (
    select coalesce(
      json_merge_preserve(
        '[]',
        concat(
          '[',
          group_concat(json_array(`v0`) separator ','),
          ']'
        )
      ),
      json_array()
    )
    from (
      select `Relation`.`id` as `v0`
      from `Relation`
      where `Relation`.`id` = `bceContacts.contact_id`
    ) as `t`
  ) as `contacts`
from `BulkContactEdit` as `bce`
  join `BulkContactEditContacts` as `bceContacts`
    on `bceContacts`.`bulkContactEdit_id` = `bce`.`id`
where `bce`.`id` = 7;

共有1个答案

谢俊英
2023-03-14

如果不打算进一步嵌套,您仍然可以使用MULTISET\u AGG,如下所示:

jooq().select(
           bce.ID, 
           bce.ORGANIZATION_NAME,
           multisetAgg(RELATION_ID)
               .as("contacts")
               .convertFrom(r - > r.map(mapping(Contact::new)))
       )
      .from(bce)
      .join(bceContacts)
          .on(bceContacts.BULK_CONTACT_EDIT_ID.eq(bce.ID))
      .leftJoin(RELATION)
          .on(RELATION.ID.eq(bceContacts.CONTACT_ID))
      .where(bce.ID.eq(Long.parseLong(content))
      .groupBy(bce.ID, bce.ORGANIZATION_NAME)
      .fetch(Records.mapping(BulkContactEdit::new));

请记住,如果一个组织没有任何联系人,则MULTISET\u AGG生成的不是空列表。

 类似资料:
  • 如果在中只有一组,这将非常好地工作。ASSESSMENT_COMMENT只有两列: 它将完美地代表一对多的关系。 现在问题来了: 那么,1)这是Hibernate中已知的bug吗?2)有办法解决这个问题吗?我可以强制Hibernate创建两个映射表,每个映射表一个吗?请记住,我不能更改类来引用(业务逻辑需求)

  • 问题内容: 在我的elasticsearch服务器中,我只有一个索引。 (博客)索引包含多种类型。 如:,。 在标签类型中,我创建了1000多个标签,并在帖子类型中创建了10个帖子。 例如:帖子 例如:标签 我想将现有标签分配给博客帖子(即,关系=>映射)。 如何将标签分配给帖子映射? 问题答案: 您可以在Elasticsearch中使用4种方法来管理关系。在Elasticsearch博客文章-E

  • 本文向大家介绍mybatis关系映射之一对多和多对一,包括了mybatis关系映射之一对多和多对一的使用技巧和注意事项,需要的朋友参考一下 本实例使用用户和订单的例子做说明: 一个用户可以有多个订单, 一个订单只对应一个用户。(其中应用到注释) 1.代码的结构 2. 建表语句: 3. 用户实体: 4. 订单实体: 5.写PersonMapper.java的接口 6. 一对多实体配置: Person

  • 我有两个表:TABLE_A和TABLE_B,它们有一些同名的列。 我想从这两个表中检索所有列,并使用Jooq将查询结果转换为Pojo类,如下所示: 我想使用@Column注释来指定哪个列来自哪个表,但Jooq似乎不支持这个特性。我如何实现这一点? 或者这个,

  • 我有几个JOOQ存储库,它们从Postgres数据库获取数据,并将数据作为值对象提供。我使用JOOQ 3.10.7和一切工作正常。我已经将我的Spring启动版本从2.0.3升级到2.1.4,这将JOOQ版本升级到3.11.10。在映射Jooq记录时,我开始获取NullPointerExcema。 在上述场景中,当没有与给定条件(user.id.eq(1))匹配的记录时,fetchSingle必须

  • 我正在hibernate的帮助下开发一个电子购物程序。因为我是jsp、servlet、hibernate的新手,我不知道如何使用关系表中的附加列进行多对多关系映射。我已经阅读了几篇教程,但其中大部分都是关于hibernate社区的注释映射和文档,但没有一篇适合我的情况。 我有三个表,分别是电影信息表、订单详情表和订单详情表(关系表),其中订单详情表的结构如下所示。 我正在尝试使用四个POJO类来实