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

基于多集条件的jooq多集序结果集

高和通
2023-03-14

收集了mit Jooq的multiset的第一次经验,我试图弄清楚如何根据multiset的一些标准来排序结果集。考虑一个带有Product表的datastructure,每个产品可以分配任意数量的存储。

使用以下查询获取产品时:

  List<ProductFilterItem> items =
        dslContext
            .select(
                PRODUCT.ID,
                PRODUCT.NAME
                multiset(
                    select(
                        PRODUCT_STORAGE.ID,
                        PRODUCT_STORAGE.PRODUCT_ID,
                        PRODUCT_STORAGE.STOCK
                        PRODUCT_STORAGE.MIN_STOCK
                    )
                        .from(PRODUCT_STORAGE)
                        .where(PRODUCT_STORAGE.PRODUCT_ID.eq(PRODUCT.ID))
                ).as("storage").convertFrom(r -> r.into(ProductStorageItem.class))
            )
            .from(PRODUCT)
            .where(queryCondition)
            .fetchInto(ProductItem.class)

如何根据多集的条件对结果进行排序。

例如,把那些已经分配存储的放在第一位。

orderBy(inline(3).desc())

给出所需的结果,但对我来说,不清楚实际的排序比较在做什么。

min(
(PRODUCT_STORAGE.STOCK - PRODUCT_STORAGE.MIN_STOCK)
  .divide(PRODUCT_STORAGE.MIN_STOCK.multiply(0.01))
)

谢谢你的帮助!

问候你,安德烈亚斯

共有1个答案

章学义
2023-03-14

从JOOQ3.15开始,multiset在所有方言中都使用SQL/XML或SQL/JSON进行仿真。虽然XML文档的顺序没有定义,但一些SQL方言可能会选择在JSON文档上定义顺序(例如,PostgreSQL为JSONB)定义顺序)。但我不认为在您的情况下依赖这种隐式排序是一个好主意(特别是,因为Jooq的仿真可能会发生微妙的变化以适应一些边缘情况),所以最好明确地说明您想要什么。

在标准SQL中,您可以再次从multiset嵌套集合中提取数据,以便找到一些聚合值,如min(...)表达式,但这似乎相当费力,而且目前jOOQ 3.15不支持(有一些标准SQL操作符可以对多组集进行操作,请参见https://github.com/jOOQ/jOOQ/issues/12031)

既然要按某个聚合值排序,为什么不使用multiset_agg而不是multiset呢?在下面的情况下,您得到了一个等价的结果,排序是很好地定义的。

List<ProductFilterItem> items = dslContext
    .select(
        PRODUCT.ID,
        PRODUCT.NAME
        multisetAgg(
            PRODUCT_STORAGE.ID,
            PRODUCT_STORAGE.PRODUCT_ID,
            PRODUCT_STORAGE.STOCK
            PRODUCT_STORAGE.MIN_STOCK
        ).as("storage").convertFrom(r -> r.into(ProductStorageItem.class))
    )
    .from(PRODUCT)
    .leftJoin(PRODUCT_STORAGE)
        .on(PRODUCT_STORAGE.PRODUCT_ID.eq(PRODUCT.ID))
    .where(queryCondition)
    .groupBy(PRODUCT.ID, PRODUCT.NAME)
    .orderBy(min(
        PRODUCT_STORAGE.STOCK
            .minus(PRODUCT_STORAGE.MIN_STOCK)
            .divide(PRODUCT_STORAGE.MIN_STOCK.multiply(0.01))
    ))
    .fetchInto(ProductItem.class)
 类似资料:
  • 在这篇文章之后,如何使用Laravel Eloquent创建多个where子句查询? 我正在尝试插入多个“和”条件: 但我收到这个错误:

  • execute方法不仅可以执行单条查询语句,而且还可以执行多条查询语句,不同查询语句之间用分号(;)隔开。在给出例子之前,先使用如下SQL建立一个图书销售表t_booksale,并向其中插入三条记录。 建立t_booksale表 DROP TABLE IF EXISTS mydb.t_booksale; CREATE TABLE mydb.t_booksale ( id int(10)

  • 问题内容: 我有一个数据库,正在运行以下查询: 上面的查询一次返回两个结果集,我不能分别触发两个查询。如何在Java类中一次处理两个结果集? 问题答案: 正确的代码来处理JDBC语句返回的多个: 重要位: 并返回以表明语句的结果只是一个数字,而不是一个。 您需要检查以了解是否还有更多结果。 确保关闭结果集或使用

  • 我有许多变更集,如果存在特定条件,我想要运行这些变更集。例如,仅当sqlCheck以例外结果执行时,才运行变更集1、2和3。 我可以将前置条件复制到每个变更集中。然而,它感觉应该有一个更有效的方法来做这件事。随着变更集数量的增长,文件中有很多重复项。 感谢任何帮助。

  • Contact实体定义了与两个MySQL表中存在的email和nickname类型的实体集合的关系。 我的问题是返回的结果集有重复的电子邮件和昵称。 当重复发生时,Hibernate正在运行以下操作。 问候你,伊恩。

  • 你可以使用 org.hibernate.criterion.Order 来为查询结果排序。 List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "F%") .addOrder( Order.asc("name") ) .addOrder( Order.desc("age") )