首页 > 解决方案 > Scala isDefined 得到 None 值,即使它有值

问题描述

传递 JSON 数组以构建 sql 查询时,如果列名字符的名称超过 30 个字符,则将 None 作为值。这是我的构建器的功能。

import com.itfsw.query.builder.SqlQueryBuilderFactory
import org.apache.commons.lang3.math.NumberUtils
import play.api.Logger
import v1.controllers.QueryParserReq

final case class ColumnEmptyException(private val message: String = "",
                                      private val cause: Throwable = None.orNull)
  extends Exception(message, cause)

class QueryParser {
  private val logger = Logger(getClass)

  def parse(json: String): Option[String] = {

    val sqlQueryBuilderFactory = new SqlQueryBuilderFactory
    val sqlBuilder = sqlQueryBuilderFactory.builder

    // build query

    try {
      val sqlQueryResult = sqlBuilder.build(json)
      logger.info(s" conditions $sqlQueryResult")
      Some(sqlQueryResult.getQuery(true))

    }
    catch {
      case ex: Exception =>
        logger.error(ex.getMessage, ex)
        None

    }


  }

  def createQuery(queryReq: QueryParserReq): Option[String] = {
    val select: String = "SELECT "
    val from: String = " FROM "
    val where: String = " WHERE "


    if (queryReq.fields.filter(k => NumberUtils.isNumber(k)).isEmpty &&
      queryReq.fields.nonEmpty
    ) {
      val builder = StringBuilder.newBuilder
      builder.append(select)
      builder.append(queryReq.fields.mkString(","))
      builder.append(from)
      builder.append(queryReq.cubeName.trim)

      println(queryReq.jsCondition)


        //No filters
      if (queryReq.jsCondition.isEmpty) {
        logger.info(s"dynamic Query is $builder")
        Some(builder.toString())
      }

        //with filters
      else {
        val filters = parse(queryReq.jsCondition)
        if (filters.isDefined) {
          builder.append(where)
          builder.append(filters.get)
          logger.info(s"dynamic Query is $builder")
          Some(builder.toString())
        }
        else {
           None
        }
      }
    }
    else {
      None
    }


  }

}

我的示例有效载荷

  1. 工作负载
{
    "filter": "{\"condition\":\"AND\",\"rules\":[{\"field\":\"hospital_id\",\"operator\":\"equal\",\"type\":\"number\",\"value\":\"3\"}]}",
    "columns": [
        {
            "columnName": "Order_status"
        }
    ],
    "groupBy": []
}
  1. 非工作负载
{
    "filter": "{\"condition\":\"AND\",\"rules\":[{\"field\":\"orbkn_surgery_procedures_hospital_id\",\"operator\":\"equal\",\"type\":\"number\",\"value\":\"3\"}]}",
    "columns": [
        {
            "columnName": "Order_status"
        }
    ],
    "groupBy": [] }

并且值query.JsCondition= {"condition":"AND","rules":[{"field":"booking_id","operator":"equal","type":"number","value":3}]} And am using libraryDependencies += "mysql" % "mysql-connector-java" % "5.1.18" mysql connector

标签: scalaplayframeworkquery-builder

解决方案


这是查询构建器的 maven com.itfsw/QueryBuilder 插件版本的问题。我正在使用

libraryDependencies += "com.itfsw" % "QueryBuilder" % "1.0.2"

升级到

libraryDependencies += "com.itfsw" % "QueryBuilder" % "1.0.4"

解决了这个问题


推荐阅读