我正在尝试在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 回答
这是因为
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]
:此外,请注意,您不需要混合使用
JPAApi
和JPA
来获取EntityManager
,因为JPAApi
具有已将其提供给给定函数的方法 .看看这是否有效