gpt4 book ai didi

mysql - 从sql中获取响应,将其存储在对象中并使用条件?

转载 作者:行者123 更新时间:2023-11-29 05:58:53 24 4
gpt4 key购买 nike

我有两个要执行的带有有效性检查的 sql 语句。我的需要是执行第一个查询并将响应存储在一个对象中并检查对象是否为空,如果不为空则执行第二个查询。所以,我尝试过类似的东西

在 rolerepository.scala=>

  override val allQuery = s"""
select UserRoles.* from
(select CASE rbac.roleTypeID
ELSE rbac.name JOIN dirNetworkInfo ni
ON UserRoles.PersonID = ni.PersonID
where ni.Loginname = {loginName}
and UserRoles.roleName in ( 'Business User ','Administrator')"""

(这只是查询的一些示例 - 此处并未完整编写。)然后我将它映射到一个对象,模型类写在外面

   override def map2Object(implicit map: Map[String, Any]): 
HierarchyEntryBillingRoleCheck = {
HierarchyEntryBillingRoleCheck(str("roleName"), oint("PersonID")) }

然后我写了getall方法来执行查询

   override def getAll(implicit loginName: String): 
Future[Seq[HierarchyEntryBillingRoleCheck]] = {
doQueryIgnoreRowErrors(allQuery, "loginName" -> loginName) }

然后我编写了检查第一个 sql 的响应是否为空的方法。这是我卡住了,无法继续进行。

    def method1()= {
val getallresponse = HierarchyEntryBillingRoleCheck
getallresponse.toString
if (getallresponse != " ")
billingMonthCheckRepository.getrepo()
}

我在最后一个右大括号中遇到错误(类型不匹配),我不知道这里可以使用什么其他逻辑。你们中的任何人都可以解释一下并给我一些解决方案吗?

我也尝试在 Controller 中使用 for 循环,但不知道如何去做。

我试过了->

      def getAll(implicit queryParams: QueryParams, 
billingMonthmodel:Seq[HierarchyEntryBillingRoleCheck]):
Action[AnyContent] = securityService.authenticate() { implicit request
=> withErrorRecovery { req =>
toJson {
repository.getAll(request.user.loginName)
for {
rolenamecheck <- billingMonthmodel

}yield rolenamecheck
}}}}

最佳答案

您没有说明您使用的是哪种数据库访问方法。 (我假设是正常的)。解决这个问题的一种方法是:

  • 创建一个与您的表匹配的案例类
  • 创建一个匹配您的案例类的解析器
  • 使用 Option(或 Either)返回一组特定参数的行

例如,也许你有:

case class UserRole (id:Int, loginName:String, roleName:String)

然后

object UserRole {
val sqlFields = "ur.id, ur.loginName, ur.roleName"
val userRoleParser = {
get[Int]("id") ~
get[String]("loginName") ~
get[String]("roleName") map {
case id ~ loginName ~ roleName => {
UserRole(id, loginName, roleName)
}
}
}
...

解析器将行映射到您的案例类。下一步是创建单行方法,如 findByIdfindByLoginName 和多行方法,可能是 allForRoleName 或其他通用过滤器方法。在您的情况下,可能(假设每个登录名有一个角色)是这样的:

def findByLoginName(loginName:String):Option[UserRole) = DB.withConnection { implicit c =>
SQL(s"select $sqlFields from userRoles ur ...")
.on('loginName -> loginName)
.as(userRoleParser.singleOpt)
}

.as(parser... 是关键。通常,您至少需要:

  • as(parser.singleOpt) 返回您的案例类的 Option
  • as(parser *) 返回您的案例类的 List(如果登录可能存在多个角色,您将需要它
  • as(scalar[Long].singleOpt) 返回一个 Option[Long] 并且对于返回 counts存在

然后,为了最终更直接地返回到您的问题,您可以调用您的 find 方法,如果它返回某些内容,则继续第二个方法调用,可能像这样:

val userRole = findByLoginName(loginName)
if (userRole.isDefined)
billingMonthCheckRepository.getrepo()

或者,更惯用一点

findByLoginName(loginName).map { userRole =>
billingMonthCheckRepository.getrepo()
...

我已经展示了返回 Option 的 find 方法,但实际上我们发现返回 Either[String,(your case class)] 更有用,然后字符串包含失败的原因。 Either 很酷。

在我的 play (2.3.x) 版本中,上述的导入是:

import play.api.db._
import play.api.Play.current
import anorm._
import anorm.SqlParser._

您将经常做这类事情,因此值得找到一组适合您的模式。

关于mysql - 从sql中获取响应,将其存储在对象中并使用条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46802525/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com