收集了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))
)
谢谢你的帮助!
问候你,安德烈亚斯
从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") )