首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Play-Scala:在DB.withConnection中调用另一个函数

Play-Scala:在DB.withConnection中调用另一个函数
EN

Stack Overflow用户
提问于 2014-11-19 05:56:23
回答 1查看 578关注 0票数 0

我想用DB.connection在一个函数中调用一个函数,如果我只使用下面的代码,我就得到了一个错误:could not find implicit value for parameter connection: java.sql.Connection

代码语言:javascript
复制
def insert(data: Recap, action_type: String, username: String, parent_page: String) =  DB.withConnection { implicit c => 
        //other code is omitted
            case Some(last_inserted_id) => {
                if(parent_page == "SO")
                    insert_SO(data, employee_id, status, last_inserted_id)//problem
                else if(parent_page == "PO")
                    insert_PO(data, employee_id, status, last_inserted_id)//problem
        //other code is omitted
    }

def insert_SO(data: Recap, employee_id: String, status: Int, last_inserted_id: Long) = {
        var so_id_list: Set[Long] = Set()
        for(ls <- data.recap_items)
            for(rs <- ls.invoice_items)
                so_id_list = so_id_list ++ Set(rs.id)

        for(ls <- so_id_list){
            if(status == 20){
                SQL("""UPDATE salesorder SET recap_id = {recap_id}, approved_id = {approved_id}, approved_datetime = NOW(), status = 20 WHERE salesorder.id = {so_id}""").on(
                'recap_id -> last_inserted_id, 'approved_id -> employee_id, 'so_id -> ls).executeUpdate()
       //other code is omitted
    }
def insert_PO(data: Recap, employee_id: String, status: Int, last_inserted_id: Long) = {
        var po_id_list: Set[Long] = Set()
        for(ls <- data.recap_items)
            for(rs <- ls.invoice_items)
                po_id_list = po_id_list ++ Set(rs.id)

        for(ls <- po_id_list){
            if(status == 20){
                SQL("""UPDATE PurchaseOrder SET recap_id = {recap_id}, approved_id = {approved_id}, approved_datetime = NOW(), status = 20 WHERE PurchaseOrder.id = {po_id}""").on(
                'recap_id -> last_inserted_id, 'approved_id -> employee_id, 'po_id -> ls).executeUpdate()
        //other code is omitted
    }

我相信如果我将DB.withConnection添加到insert_SOinsert_PO函数中,它会工作,但是我不确定这是否是一个很好的实践,因为我用DB创建了另一个连接。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-19 06:29:34

您需要一个Connection来运行一个查询,并且可以从play.api.db.DB助手中检索一个查询。

代码语言:javascript
复制
  def insert_SO(data: Recap, employee_id: String, status: Int, last_inserted_id: Long) = {
    DB.withConnection { implicit c =>
        // other operations
        SQL(......).executeUpdate()
    }
  } 

每次调用连接时,withConnection都会获取和关闭连接。

尝试忽略一个for循环,使用Batch Query代替for loop

代码语言:javascript
复制
def insert_SO(data: Recap, employee_id: String, status: Int, last_inserted_id: Long) = {    
 DB.withConnection { implicit c =>
  //other operations
  val posQuery = SQL("""UPDATE salesorder SET recap_id = {recap_id}, approved_id = {approved_id}, approved_datetime = NOW(), status = 20 WHERE salesorder.id = {so_id}""")
  val posBatchQuery = (posQuery.asBatch /: so_id_list){(sql, ls) =>
    sql.addBatchParams(last_inserted_id,employee_id,ls)
  }  
  val posBatchAry = posBatchQuery.execute
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27009973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档