3

我即将在 Lift 框架中开始我的第一个项目,我必须决定选择哪个持久性库。我即将使用关系后端,因此 Mapper 和 Record 都可以发挥作用。

在 Mapper 的情况下——我最想念的是控制发送到 RDBMS 的查询的能力——尤其是当涉及到更复杂的查询时,这些查询将通过 SQL 中的连接、聚合等来解决。举个例子——让我们有以下两个实体:

class BaseProduct extends LongKeyedMapper[BaseProduct] with IdPK {
  // some fields
}
object BaseProduct extends BaseProduct with LongKeyedMetaMapper[BaseProduct]

class MyProduct extends LongKeyedMapper[MyProduct] with IdPK {
  // some fields
  object base extends MappedLongForeignKey(this, BaseProduct)
}
object MyProduct extends MyProduct with LongKeyedMetaMapper[MyProduct]

哪里MyProductBaseProduct实体的专业化之一。这些实体之间显然存在一对一的关系。然而,我想出的最好的可能性来查询确切MyProduct的信息BaseProduct是这样的查询:

MyProduct.findAll(PreCache(MyProduct.base))

哪个发出两个查询(此外,我恐怕无法控制MyProduct要选择的实体的哪些字段。

对于 Mapper 库来说已经够糟糕了。我对 Record/Squeryl API 的主要担忧是它缺少ProtoMapper API 周围存在的所有这些类。是否有接近这些类的记录功能的东西?是否可以访问 Squeryl 中的数据库特定功能(例如 PostgreSQL 中的几何查询)?

这些层中的任何一个还有其他优点和缺点吗?或者,如果我想对与数据库的通信进行适当的类型安全封装,并且可以对查询进行适当的控制,是否还有其他值得关注的抽象层(我习惯于直接使用 PHP 中的 PDO 层发出查询 - 我不想要这样的直接查询界面,但控制查询的可能性会很大)与 Lift 框架的集成绝对是一个优势。

谢谢!

4

1 回答 1

5

我们将 Squeryl 与 Lift 一起使用已经有一段时间了,并且对它非常满意。根据您上面的案例,在当前版本的 Squeryl (0.9.5) 中,您可以执行以下操作:

class BaseProduct(id:Long, some more fields) extends KeyedEntity[Long] {

}

class MyProduct(id:Long, some more fields) extends KeyedEntity[Long] {

}

然后,您将有一个定义如下关系的模式(我假设它们在 ID 字段中加入):

val baseProducts = Table[BaseProduct]("base_products")
val myProducts = Table[MyProduct]("my_products")
val myProductsToBaseProducts = 
  oneToManyRelation(myProducts, baseProducts).via((mp, bp) =>
    mp.id === bp.id)

要查询这两条记录,您可以执行以下操作:

from(myProducts, baseProducts) ( (mp, bp) =>
  where(mp.id === bp.id and mp.id === LOOKUPVAL) 
  select(bp, mp) )

上面的查询将从单个 SQL 选择返回一个 (BaseProduct, MarketProduct) 元组。

您还可以使用关系来检索相关项目,例如通过将此方法添加到MyProduct

def baseProduct = myProductsToBaseProducts.left(this)

但是,就像您在 Mapper 中的示例一样,它将发出第二个查询。至于进行特定于数据库的查询,有一个&运算符允许您在服务器上评估表达式。如果该函数在 Squeryl 中不可用,您可以创建自定义函数

总的来说,我发现 Squeryl 非常灵活,是 ORM 和直接 SQL 之间的完美混合体。它的性能非常好,而且我还没有找到太多 Squeryl 禁止我轻松获取所需数据库功能的地方。下一个版本会变得更容易,因为 0.9.6 将在自定义类型方面具有更大的灵活性。

于 2013-02-05T22:35:42.430 回答