暴露0.27.1是否能够翻译以下SQL语句?
SELECT FirstName, LastName,
(SELECT COUNT(O.Id)
FROM "Order" O
WHERE O.CustomerId = C.Id) AS OrderCount
FROM Customer C;
下面是我尝试的内容,但不幸的是,子查询独立于查询的其余部分工作。
val query = Customer
.leftJoin(Order, { Customer.id }, { Order.customerId })
.slice(
Customer.firstName,
Customer.lastName,
intLiteral(Order
.innerJoin(Customer, { Order.customerId }, { Customer.id })
.slice(Order.id.count())
.select { Order.customerId eq Customer.id }
.first()[Order.id.count()].toInt())//.alias("OrderCount")
)
.selectAll()
此外,如果可能的话,那么如何使用别名从ResultRow获取结果?在这个示例之后,解决方案似乎是将整个子查询存储在单个变量中,并使用一个alias()方法调用,但这看起来很难看。有没有更好的方法?
谢谢,这很有效,尽管第一个解决方案很难理解,如果您能对所应用的逻辑进行一些文本解释,我们将不胜感激。
我设法从中提取数据:
assertEquals("Manuel", query.andWhere { subQuery[orderCount] eq intLiteral(2) }.first()[Customer.firstName])
但是我无法从第二个解决方案中提取数据。这是我所做的:
val orderCount = Order.id.count().alias("OrderCount")
val query = Customer
.leftJoin(Order, { Customer.id }, { Order.customerId })
.slice(Customer.firstName, Customer.lastName, orderCount)
.selectAll()
.groupBy(Customer.id)
assertEquals("Manuel", query.andWhere { orderCount eq intLiteral(2) }.first()[Customer.firstName])
官方F.A.Q.表示,进行子查询的唯一方法是通过alias进行内部查询:
val orderCount = Order.customerId.count().alias("OrderCount")
val subQuery = Order.slice(Order.customerId, orderCount)
.selectAll()
.groupBy(Order.customerId)
.alias("subQuery")
val query = Join(Customer)
.join(subQuery, JoinType.LEFT, subQuery[Order.customerId], Customer.id)
.slice(Customer.firstName, Customer.lastName, subQuery[orderCount])
.selectAll()
但也许这里不需要子查询?这一次生成的SQL查询略有不同,查询结果几乎相同(与前一次相比,如果没有客户订单,它将返回0而不是null):
val query = Customer
.leftJoin(Order, { Customer.id }, { Order.customerId })
.slice(Customer.firstName, Customer.lastName, Order.id.count().alias("OrderCount"))
.selectAll()
.groupBy(Customer.id)
生成的SQL:
SELECT CUSTOMER."firstName",
CUSTOMER."lastName",
COUNT("ORDER".ID) OrderCount
FROM CUSTOMER
LEFT JOIN "ORDER" ON CUSTOMER.ID = "ORDER"."customerId"
GROUP BY CUSTOMER.ID
以前的答案不会在选择子句中生成子查询。下面描述的方式允许它。这是在暴露的0.36.2上测试的。
下一个示例执行SQL:
SELECT "groups".id, "groups".name,
(SELECT COUNT(group_members.user_id) FROM group_members
WHERE group_members.group_id = "groups".id) members_count
FROM "groups";
首先,我们需要一个将AliasQuery转换为表达式的包装器:
class SubQueryExpression<T>(private val aliasQuery : QueryAlias) : Expression<T>() {
override fun toQueryBuilder(queryBuilder: QueryBuilder) {
aliasQuery.describe(TransactionManager.current(), queryBuilder)
}
}
创建子查询:
val membersCount = GroupMembersTable.userId.count()
val subSelect = GroupMembersTable
.slice(membersCount)
.select { GroupMembersTable.groupId eq GroupsTable.id}
val subQuery: QueryAlias = subSelect.alias("members_count")
将子查询包装到表达式:
val membersCountExp = SubQueryExpression<Long>(subQuery)
进行完整查询:
val q = GroupsTable
.slice(GroupsTable.fields + membersCountExp)
.selectAll()
执行并读取计算值:
q.forEach {
println(it[membersCountExp])
}
> 如何将选择查询映射到类 是否有任何@transactional操作来执行查询?
我试图用OkHttp和Cucumber在静态编程语言中设置一个Spring启动项目,并且在运行Cucumber任务时遇到以下错误。如何修复? 还有build gradle kts片段 我看到了这个错误https://github.com/square/okio/issues/647看起来可能是它,并修复了这个build.gradle,我如何将其翻译为kotlinbuild.gradle.kts?
当结合使用SpringWebFlux和Kotlin协同程序时,我很难理解一个简单的RESTfulWS响应处理场景。假设我们在REST控制器中有一个简单的WS方法,该方法可能返回大量(数百万)响应“things”: 这正如人们所期望的那样:只要使用流媒体类型(例如“application/x-ndjson”),结果就会流式传输到客户端。在更复杂的服务调用中,也考虑了错误/警告的可能性,我希望返回以下
我有以下问题:-创建了几个模块来实现类,并用-我的Android应用程序正在使用检索这些类。但是由于某种原因,没有在
如图所示,https://stackoverflow.com/a/16639438/8949356,在Java中,当声明的类是公共类时,可以重写其函数 但是我想知道如何用静态编程语言编写完全相同的代码,我已经尝试了很多,但没有找到任何关于这个主题的东西。我可以在Java中去做这件事,但我的其余代码是用静态编程语言编写的,而且我不能一直带着这种怀疑;静态编程语言对我来说是一个很好的工具,我想学习它。
我正在尝试用Java编写下面用Kotlin编写的代码。我无法创建DefaultElementsAdapter,因为我无法获得正确的语法。 我无法获得正确的Java代码 Kotlin班是这样的 我正在尝试使用图书馆https://github.com/m7mdra/HtmlRecycler