首页 文章

Play for Scala中的JPA查询会引发编译错误

提问于
浏览
0

我正在尝试在Play for Scala中实现JPA查询 . 我从here获取了信息,但由于这些例子是用Java编写的,我可能会弄错 . 这是代码:

class ManageBanks @Inject() (jpaApi: JPAApi) extends Controller {

   @Transactional
   def readMany = {
      val em = jpaApi.em

      jpaApi.withTransaction( (em: EntityManager) => {   //  <-- error in this line
          val query = em.createQuery("from BankHib order by name")
          val list = query.getResultList.asScala.toList.map(_.asInstanceOf[BankHib])
          list
      })
   }
}

编译时出现以下错误:

重载方法值withTransaction with alternatives:[T](x $ 1:String,x $ 2:Boolean,x $ 3:java.util.function.Supplier [T])T(x $ 1:Runnable)Unit [T](x $ 1 :java.util.function.Supplier [T])T [T](x $ 1:String,x $ 2:Boolean,x $ 3:java.util.function.Function [javax.persistence.EntityManager,T])T [T ](x $ 1:String,x $ 2:java.util.function.Function [javax.persistence.EntityManager,T])T [T](x $ 1:java.util.function.Function [javax.persistence.EntityManager,T] ])T不能应用于(javax.persistence.EntityManager⇒List[admin.manage.BankHib])

这段代码出了什么问题?如何使查询工作?

2 回答

  • 1

    这是因为 play.db.jpa.JPAApi.withTransaction 具有以下签名:

    • withTransaction(java.util.function.Function<javax.persistence.EntityManager,T>)

    • withTransaction(java.lang.String, java.util.function.Function<javax.persistence.EntityManager,T>)

    • withTransaction(java.lang.String, boolean, java.util.function.Function<javax.persistence.EntityManager,T>)

    • withTransaction(java.util.function.Supplier<T>)

    • withTransaction(java.lang.Runnable)

    • 最后 withTransaction(java.lang.String, boolean, java.util.function.Supplier<T>) .

    但是你传递的是类型为 (javax.persistence.EntityManager ⇒ List[admin.manage.BankHib]) 的Scala函数 . 所以,错误的类型和编译器抱怨说它无法找到替代品 .

    那么正确的方法是使用 java.util.function.Function[EntityManager, List]

    class ManageBanks @Inject()(jpaApi: JPAApi) extends Controller {
    
      def readMany = {
        jpaApi.withTransaction(new java.util.function.Function[EntityManager, List[BankHib]] {
          override def apply(em: EntityManager): List[BankHib] = {
            val query = em.createQuery("from BankHib order by name")
            query.getResultList.asScala.map(_.asInstanceOf[BankHib]).toList
          }
        })
      }
    }
    

    此外,请注意,您不需要混合使用 JPAApiJPA 来获取 EntityManager ,因为 JPAApi 具有已将其提供给给定函数的方法 .

  • 0

    看看这是否有效

    class ManageBanks @Inject() (jpaApi: JPAApi) extends Controller {
    
       @Transactional
       def readMany = {
    
    
          jpaApi.withTransaction( () => {   //  <-- error in this line
              val em = JPA.em() // or jpaApi.em
              val query = em.createQuery("from BankHib order by name")
              val list = query.getResultList.asScala.toList.map(_.asInstanceOf[BankHib])
              list
          })
       }
    }
    

相关问题