postgresql - 在 ScalaQuery O/R 框架中映射自定义类型

标签 postgresql scala orm scalaquery

在他的comparison of ScalaQuery and Squeryl中,Stefan Zeiger(ScalaQuery 的作者)在第三个要点中说道:

ScalaQuery comes with support for a basic set of JDBC types and can be extended with DBMS- or application-specific types.

但是,我一直无法找到如何实际执行此操作的示例或解释。我正在尝试为 Postgres 数据库编写 ScalaQuery 架构,其中某些列是我在 Postgres 中创建的自定义枚举类型。

例如,我有一个名为 gender 的枚举类型,可能的值为 malefemale。这不是 Java 枚举,而是作为整数保存到数据库中。相反,它是 DBMS 中定义的自定义 Postgres 类型。 Postgres 使用特殊的 4 字节数据结构存储那些数据,而不是作为原语。

如何将 gender 类型的 Postgres 列合并到 ScalaQuery 架构中?

(如果您认为不同的强类型 O/R 方法更适合该任务,我也将不胜感激。我已经研究过 Squeryl,并且不相信它可以处理自定义类型,除非它们被持久化作为 DBMS 中的原语。)

最佳答案

import org.scalaquery.ql.{MappedTypeMapper => Mapper}

object TypeMapper {

  type Stamp = java.sql.Timestamp

  val joda2Stamp = 
    Mapper.base[JodaTime, Stamp](
      dt => new Stamp(dt.getMillis), 
      ts => new JodaTime(ts.getTime) )
}

然后,例如,在您的 DAO 中(或任何运行查询的地方),使用它:

import TypeMapper._
implicit val j2Stamp = joda2Stamp // type conversion automatically

您需要尝试对 Enums 和 PostGres 的枚举存储类型实现相同的效果。我倾向于不打扰,更喜欢使用 Java 枚举并存储为原始类型。

例如:

public enum CardType implements ILabel {
  V("Visa"),
  M("MasterCard"),
  D("Discover"),
  A("American Express");

  private CardType(String label) { this.label = label; }
  public String getLabel() { return this.label; }
  final String label;

  public static List<String> asList() {
    return EnumHelper.asList(CardType.class);
  }

  public static Map<String,String> asMap() {
    return EnumHelper.asMap(CardType.class);
  }
}

然后将其作为 char(1) 存储在数据库中 Orders.insert(cardType = cardType.toString),或者您可以创建类型映射器 Enum-String 转换并省略 enum.toString在插入物上...

关于postgresql - 在 ScalaQuery O/R 框架中映射自定义类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11136078/

相关文章:

斯卡拉 : Understanding Future. 恢复

JPA一对一映射给sax解析异常

django/celery : Best practices to run tasks on 150k Django objects?

sql - 通过查询索引 max + group

sql - 如何删除从 SQL 查询获取的以下数据中的交换列?

scala - 如何使用猫和 State Monad

java - 无法从 Java/Scala 控制台应用程序打开工作的 VIM 编辑器

java - hibernate 级联 : Object references an unsaved transient instance - save the transient instance before flushing

postgresql - 复杂连接上的重复数组

php - 如何在 postgresql 上将一个查询的输出作为另一个查询的输入?