编写一些querydsl代码。在Java中,我会这样:
@Test
void countTest() {
NumberPath<Long> cnt = Expressions.numberPath(Long.class, "count");
NumberPath<Long> typeId = Expressions.numberPath(Long.class, "type_id");
List<Long> fetched = sql.select(typeId)
.from(SQLExpressions.select(tGroup.typeId.as(typeId), tGroup.count().as(cnt))
.from(tGroup)
.groupBy(tGroup.typeId))
.where(cnt.gt(100L)).fetch();
System.out.println(fetched);
}
请注意Long.class
中的此Expressions.numberPath(Long.class, ...)
如果创建.kt
文件并复制粘贴上述Java代码,则Intellij会将其转换为:
Expressions.numberPath(Long::class.java, ...)
。
所以我得到的结果Kotlin代码是:
val cnt = Expressions.numberPath(Long::class.java, "count")
val typeId = Expressions.numberPath(Long::class.java, "type_id")
val fetched = sql.select(typeId)
.from(SQLExpressions.select(QTGroup.tGroup.typeId.`as`(typeId), QTGroup.tGroup.count().`as`(cnt))
.from(QTGroup.tGroup)
.groupBy(QTGroup.tGroup.typeId))
.where(cnt.gt(100L)).fetch()
println(fetched)
现在,当我运行代码时,我得到:
java.lang.IllegalArgumentException: Unsupported target type : long
at com.querydsl.core.util.MathUtils.cast(MathUtils.java:86)
at com.querydsl.core.types.dsl.NumberExpression.cast(NumberExpression.java:178)
at com.querydsl.core.types.dsl.NumberExpression.gt(NumberExpression.java:337)
at project.dao.QuerydslKotlinCountTest.countTest(QuerydslKotlinCountTest.kt:30)
所以它不是我所期望的Class<java.lang.Long>
,而是某些类Class<long>
(以前从未见过,并且无法通过Class.forName("long")
编程获得它)。
所以,如何在Kotlin中使这段简单的代码起作用?如果将Long::class.java
替换为java.lang.Long::class.java
,则代码无法编译:
Error:(27, 104) Kotlin: None of the following functions can be called with the arguments supplied:
public open fun `as`(p0: Path<Long!>!): NumberExpression<Long!>! defined in com.querydsl.core.types.dsl.NumberExpression
public open fun `as`(p0: String!): NumberExpression<Long!>! defined in com.querydsl.core.types.dsl.NumberExpression
我使之起作用的唯一方法是使用装箱的Java原语:java.lang.Long.valueOf(1).javaClass
,但看起来很丑。
尝试使用KClass
的javaObjectType
属性代替javaObjectType
,例如: