如何消除 QueryDsl 动态搜索运算符中的 Unsupported target type : int 错误

发布于 2025-01-15 13:22:06 字数 10249 浏览 3 评论 0原文

我使用了这个例子 https://baeldung-cn.com/ rest-api-search-language-spring-data-querydsl 在 Kotlin 中实现相同的功能。

我创建了一个名为 Shift 的实体。查询对于相等运算符运行良好。当涉及到其他运算符时,它会抛出此错误。

  "java.lang.IllegalArgumentException: Unsupported target type : int\n\tat com.querydsl.core.util.MathUtils.cast(MathUtils.java:86)\n\tat com.querydsl.core.types.dsl.NumberExpression.cast(NumberExpression.java:178)\n\tat com.querydsl.core.types.dsl.NumberExpression.goe(NumberExpression.java:293)\n\tat com.presto.salesApp.common.querydsl.ShiftPredicate.getPredicate(ShiftPredicate.kt:19)\n\tat com.presto.salesApp.common.querydsl.ShiftPredicatesBuilder.build$lambda-0(ShiftPredicatesBuilder.kt:34)\n\tat java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)\n\tat java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1654)\n\tat java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)\n\tat java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)\n\tat java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)\n\tat java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)\n\tat java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)\n\tat com.presto.salesApp.common.querydsl.ShiftPredicatesBuilder.build(ShiftPredicatesBuilder.kt:37)\n\tat com.presto.salesApp.modules.shift.ShiftController.getQueryDslShift(ShiftController.kt:166)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:566)\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:655)\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:764)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540)\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895)\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1732)\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\n\tat java.base/java.lang.Thread.run(Thread.java:834)\n",
    "message": "Unsupported target type : int",

抛出了错误

         ">" -> return path.goe(value)

当我调试应用程序时,我发现ShiftPredicate 类的这一行

。这是我的 ShiftPredecateBuilder 类

   package com.presto.salesApp.common.querydsl

import com.querydsl.core.types.Predicate
import com.querydsl.core.types.dsl.BooleanExpression
import com.querydsl.core.types.dsl.Expressions
import java.util.*
import java.util.stream.Collectors


class ShiftPredicatesBuilder {
         // val params: List<SearchCriteria> = listOf<SearchCriteria>() ;
    val params : MutableList<SearchCriteria> = ArrayList()
//    fun ShiftPredicatesBuilder() {
//        params = ArrayList<SearchCriteria>();
//    }

    fun with(
        key: String, operation: String, value: Any
    ): ShiftPredicatesBuilder {
        params.add(SearchCriteria(key, operation, value))
        return this
    }


    fun build(): BooleanExpression {
//        if (params!!.size == 0) {
//            return null;
//        }
//

        val predicates: MutableList<BooleanExpression> = params
            .stream()
            .map<BooleanExpression> {
           param: SearchCriteria -> ShiftPredicate(param).getPredicate()
            }
            .filter(Objects::nonNull)
            .collect(Collectors.toList())


        var result = Expressions.asBoolean(true).isTrue;


        for (predicate in predicates) {
            result = result.and(predicate as Predicate?)
        }
        return result;

    }

}

这是 ShiftPredicate 类,

  package com.presto.salesApp.common.querydsl

import com.presto.salesApp.modules.shift.Shift
import com.querydsl.core.types.dsl.BooleanExpression
import com.querydsl.core.types.dsl.PathBuilder


class ShiftPredicate(paraCriteria: SearchCriteria) {
    private val criteria: SearchCriteria =paraCriteria;

    fun getPredicate(): BooleanExpression?
          {
            val entityPath: PathBuilder<Shift?> = PathBuilder<Shift?>(Shift::class.java, "shift")
            if (isNumeric(criteria.value.toString())) {
                val path = entityPath.getNumber(criteria.key, Int::class.java)
                val value = criteria.value.toString().toInt()
                when (criteria.operation) {
                    ":" -> return path.eq(value)
                    ">" -> return path.goe(value)
                    "<" -> return path.lt(value)
                }
            } else {
                val path = entityPath.getString(criteria.key)
                if (criteria.operation.equals(":", ignoreCase = true)) {
                    return path.containsIgnoreCase(criteria.value.toString())
                }
            }
            return null
        }


        fun isNumeric(str: String): Boolean {
            try {
                str.toInt()
            } catch (e: NumberFormatException) {
                return false
            }
            return true
        }

}


这是控制器方法。我暂时对值进行了硬编码,

    @GetMapping("/search")
    fun getQueryDslShift(@RequestParam(value = "search") search: String): Any {

        val builder = ShiftPredicatesBuilder().with("version",">",3)
        val exp: BooleanExpression = builder.build()

        return shiftService.getQueryDSLShiftByPredicate(exp)

    }

这是错误, 输入图片此处描述

在 POM 中使用此版本

  <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-jpa</artifactId>
            <version>5.0.0</version>
        </dependency>

I used this example https://baeldung-cn.com/rest-api-search-language-spring-data-querydsl to implement the same in Kotlin.

I created an entity called Shift. Querying is working fine for the equal operators. When comes to the other operators, It throws this error.,

  "java.lang.IllegalArgumentException: Unsupported target type : int\n\tat com.querydsl.core.util.MathUtils.cast(MathUtils.java:86)\n\tat com.querydsl.core.types.dsl.NumberExpression.cast(NumberExpression.java:178)\n\tat com.querydsl.core.types.dsl.NumberExpression.goe(NumberExpression.java:293)\n\tat com.presto.salesApp.common.querydsl.ShiftPredicate.getPredicate(ShiftPredicate.kt:19)\n\tat com.presto.salesApp.common.querydsl.ShiftPredicatesBuilder.build$lambda-0(ShiftPredicatesBuilder.kt:34)\n\tat java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)\n\tat java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1654)\n\tat java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)\n\tat java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)\n\tat java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)\n\tat java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)\n\tat java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)\n\tat com.presto.salesApp.common.querydsl.ShiftPredicatesBuilder.build(ShiftPredicatesBuilder.kt:37)\n\tat com.presto.salesApp.modules.shift.ShiftController.getQueryDslShift(ShiftController.kt:166)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:566)\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:655)\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:764)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540)\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895)\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1732)\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\n\tat java.base/java.lang.Thread.run(Thread.java:834)\n",
    "message": "Unsupported target type : int",

When I debugged the app, I found that an error is thrown from,

         ">" -> return path.goe(value)

this line of ShiftPredicate class.

This is my ShiftPredecateBuilder class

   package com.presto.salesApp.common.querydsl

import com.querydsl.core.types.Predicate
import com.querydsl.core.types.dsl.BooleanExpression
import com.querydsl.core.types.dsl.Expressions
import java.util.*
import java.util.stream.Collectors


class ShiftPredicatesBuilder {
         // val params: List<SearchCriteria> = listOf<SearchCriteria>() ;
    val params : MutableList<SearchCriteria> = ArrayList()
//    fun ShiftPredicatesBuilder() {
//        params = ArrayList<SearchCriteria>();
//    }

    fun with(
        key: String, operation: String, value: Any
    ): ShiftPredicatesBuilder {
        params.add(SearchCriteria(key, operation, value))
        return this
    }


    fun build(): BooleanExpression {
//        if (params!!.size == 0) {
//            return null;
//        }
//

        val predicates: MutableList<BooleanExpression> = params
            .stream()
            .map<BooleanExpression> {
           param: SearchCriteria -> ShiftPredicate(param).getPredicate()
            }
            .filter(Objects::nonNull)
            .collect(Collectors.toList())


        var result = Expressions.asBoolean(true).isTrue;


        for (predicate in predicates) {
            result = result.and(predicate as Predicate?)
        }
        return result;

    }

}

This is ShiftPredicate class,

  package com.presto.salesApp.common.querydsl

import com.presto.salesApp.modules.shift.Shift
import com.querydsl.core.types.dsl.BooleanExpression
import com.querydsl.core.types.dsl.PathBuilder


class ShiftPredicate(paraCriteria: SearchCriteria) {
    private val criteria: SearchCriteria =paraCriteria;

    fun getPredicate(): BooleanExpression?
          {
            val entityPath: PathBuilder<Shift?> = PathBuilder<Shift?>(Shift::class.java, "shift")
            if (isNumeric(criteria.value.toString())) {
                val path = entityPath.getNumber(criteria.key, Int::class.java)
                val value = criteria.value.toString().toInt()
                when (criteria.operation) {
                    ":" -> return path.eq(value)
                    ">" -> return path.goe(value)
                    "<" -> return path.lt(value)
                }
            } else {
                val path = entityPath.getString(criteria.key)
                if (criteria.operation.equals(":", ignoreCase = true)) {
                    return path.containsIgnoreCase(criteria.value.toString())
                }
            }
            return null
        }


        fun isNumeric(str: String): Boolean {
            try {
                str.toInt()
            } catch (e: NumberFormatException) {
                return false
            }
            return true
        }

}


This is the controller method. I hardcoded values for the moment,

    @GetMapping("/search")
    fun getQueryDslShift(@RequestParam(value = "search") search: String): Any {

        val builder = ShiftPredicatesBuilder().with("version",">",3)
        val exp: BooleanExpression = builder.build()

        return shiftService.getQueryDSLShiftByPredicate(exp)

    }

This is the error,
enter image description here

Used this version in POM

  <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-jpa</artifactId>
            <version>5.0.0</version>
        </dependency>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

世俗缘 2025-01-22 13:22:06

我之前也遇到过同样的问题
尝试使用 javaObjectType 返回 Int 类,然后它在您的代码上工作

进行更改,

val path = entityPath.getNumber(criteria.key, Int::class.java)

,尝试对此

val path = entityPath.getNumber(criteria.key, Int::class.javaObjectType)

我希望这会有所帮助。

I faced the same issues before,
Try returning the Int class with javaObjectType, and then its working

on your code, try change this

val path = entityPath.getNumber(criteria.key, Int::class.java)

with this

val path = entityPath.getNumber(criteria.key, Int::class.javaObjectType)

I hope this helps.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文