我有一个表订阅,我想在一个连接中用JOOQ编写多个selectCount,并用不同的谓词连接到数据库。为此,我创建了一个查询列表:
List<Query> countQueries = channels.stream().map(c ->
selectCount().from(SUBSCRIPTION)
.innerJoin(SENDER).on(SENDER.ID.equal(SUBSCRIPTION.SENDER_ID))
.innerJoin(CHANNEL).on(CHANNEL.ID.equal(SUBSCRIPTION.CHANNEL_ID))
.where(SENDER.CODE.equal(senderCode))
.and(CHANNEL.CODE.equal(c))
).collect(toList());
最后,我使用批处理启动了这个查询列表:
using(configuration).batch(countQueries).execute();
我原本希望在执行的返回值中包含上述查询的结果,但我得到了一个整数数组,其中填充了0个值。
这是使用JOOQ运行多个selectCount
的正确方法吗?执行
方法返回的整数数组的含义是什么?
我在JOOQ博客中查看了这个链接,讨论了“如何在一个查询中计算多个聚合函数”,但它只是关于SQL查询,没有JOOQ方言。
我原本希望在execute的返回值中包含上述查询的结果,但我得到了一个整数数组,其中填充了0个值。
批()
API只能用于DML查询(INSERT
、UPDATE
、DELETE
),就像使用本机JDBC一样。我的意思是,您可以将查询作为批处理运行,但不能以这种方式获取结果。
我在JOOQ博客中查看了这个链接,讨论了“如何在一个查询中计算多个聚合函数”,但它只是关于SQL查询,没有JOOQ方言。
简单的SQL查询几乎总是从字面上翻译成jOOQ,因此您也可以将本文中的技术应用到您的案例中。事实上,你应该!运行这么多查询绝对不是一个好主意。
那么,让我们看看如何将这个简单的SQL示例从链接转换到您的案例:
Record record =
ctx.select(
channels.stream()
.map(c -> count().filterWhere(CHANNEL.CODE.equal(c)).as(c))
.collect(toList())
)
.from(SUBSCRIPTION)
.innerJoin(SENDER).on(SENDER.ID.equal(SUBSCRIPTION.SENDER_ID))
.innerJoin(CHANNEL).on(CHANNEL.ID.equal(SUBSCRIPTION.CHANNEL_ID))
.where(SENDER.CODE.equal(senderCode))
.and(CHANNEL.CODE.in(channels)) // Not strictly necessary, but might speed up things
.fetch();
这将产生一条包含所有计数值的记录。
一如既往,这是假设以下静态导入
import static org.jooq.impl.DSL.*;
当然,您也可以在特定情况下使用经典的分组方式。这可能会更快一些:
Result<?> result =
ctx.select(CHANNEL.CODE, count())
.from(SUBSCRIPTION)
.innerJoin(SENDER).on(SENDER.ID.equal(SUBSCRIPTION.SENDER_ID))
.innerJoin(CHANNEL).on(CHANNEL.ID.equal(SUBSCRIPTION.CHANNEL_ID))
.where(SENDER.CODE.equal(senderCode))
.and(CHANNEL.CODE.in(channels)) // This time, you need to filter
.groupBy(CHANNEL.CODE)
.fetchOne();
现在,这将生成一个表,每个代码有一个计数值。或者,将其提取到地图中
Map<String, Integer> map =
ctx.select(CHANNEL.CODE, count())
.from(SUBSCRIPTION)
.innerJoin(SENDER).on(SENDER.ID.equal(SUBSCRIPTION.SENDER_ID))
.innerJoin(CHANNEL).on(CHANNEL.ID.equal(SUBSCRIPTION.CHANNEL_ID))
.where(SENDER.CODE.equal(senderCode))
.and(CHANNEL.CODE.in(channels))
.groupBy(CHANNEL.CODE)
.fetchMap(CHANNEL.CODE, count());
我正在使用标记为我的搜索框创建一个建议列表,但是我不能从数据列表中选择多个值。当前,我得HTML是:
我对使用MySQL非常陌生,我还在学习。 假设我有3个表在一个数据库。表格如下: 包含ID(PK)和Name 包含ID(主键)、姓名等 包含rol_num(PK),student_id和course_id。 student_id参考学生(id)course_id参考课程(id) 基本上学生详情在学生表中,课程详情在课程表中,入学表是学生及其课程的链接表 使用Select query命令,如何获取所
问题内容: 这是我的代码: 您可以看到我要执行的操作,但是我不确定如何正确编写此查询。 我得到的继承人错误: 警告:mysql_fetch_assoc():提供的参数不是有效的MySQL结果资源 这是我的mysql_fetch_assoc: 问题答案: 尝试改变…的喜欢 …至…
问题内容: 我有两个表,一个“公司”和一个“员工”: 我想在表中列出每个员工,并在其旁边列出公司。通过调用并在模板循环中通过并调用,这非常简单。 该解决方案的问题在于,将为循环中的每个项目创建一个新查询。因此,对于每个员工,公司都会有一个查询,看起来像这样: 相反,我希望最初在获取雇员的同一查询中加入此联接。像这样: Django QuerySet是否可能?如果没有,有没有办法可以解决此问题(没有
问题内容: 我有以下查询,希望在单个选择请求中运行: 问题在于,所有内容都是通过单独的多个查询获取的。我只希望在单个请求中获取团队和团队的球员以及每个球员的技能。但是取而代之的是,我有多个选择查询来获取每个球队,每个球员,每个球员的统计数据和技能。 以下是带有给定注释的实体: 游戏实体: 团队实体: 玩家实体: 您能指出犯下的错误吗?我需要一个选择查询来加载游戏,它是团队,团队的球员和每个球员的技
问题内容: 好的,我想我可能会忽略一些显而易见的/简单的事情…但是我需要编写一个查询,该查询仅返回与同一列上的多个条件匹配的记录… 我的表是一个非常简单的链接设置,用于将标志应用于用户… 等等…在这种情况下,您会看到联系人99和100都被标记为“志愿者”和“已上传” … 我需要做的是返回仅与通过搜索表单输入的多个条件相匹配的那些contactid … contactid必须与所有选择的标志匹配…在