无法在 Kotlin 中添加标准 api 谓词,获取 Type interface failed 错误

Sup*_*shi 3 hibernate criteria-api kotlin

我遇到了无法解决的非常烦人的问题,我想我错过了一些非常直接的东西,因为我已经有了 Java 中的工作代码。

基本上我所拥有的是这样的:

class ConfigurationSpecification(
        private var list: MutableList<SearchCriteria> = mutableListOf()
) : Specification<Configuration> {
    override fun toPredicate(root: Root<Configuration>, query: CriteriaQuery<*>, builder: CriteriaBuilder): Predicate? {
        val predicates: MutableList<Predicate> = mutableListOf()

        for (criteria in list) {
            if (criteria.operation == "EQUALS") {
                predicates.add(builder.equal(root.get(criteria.key), criteria.value)) <- NOT WORKING root.get(criteria.key) this is making issue
            }
        }

        return builder.and(predicates[0])
    }
}
Run Code Online (Sandbox Code Playgroud)

代码真的很简单,但由于某种原因 Kotlin 抱怨它,我得到的错误是这样的:

错误:(19, 51) Kotlin:类型推断失败:没有足够的信息来推断 fun get(p0: String!): 中的参数 Y:路径!请明确指定。

这是工作的java代码:

predicates.add(builder.equal(root.get(criteria.getKey()), criteria.getValue())); <- working with Java
Run Code Online (Sandbox Code Playgroud)

任何有经验的 Kotlin 人知道这个错误的解决方法吗?我见过其他一些人有类似的问题,但我无法根据我看到的答案解决这个问题。

ard*_*nit 9

从文档:

< Y> Path< Y> get(String attributeName)

创建与引用属性对应的路径。

注意:使用基于字符串的 API 的应用程序可能需要指定 get 操作产生的类型,以避免使用 Path 变量。

要修复您的错误,您需要明确指定泛型类型,因为 Kotlin 编译器无法从上下文中推断出它:

predicates.add(builder.equal(root.get</* type of criteria.value */>(criteria.key), criteria.value))
Run Code Online (Sandbox Code Playgroud)