2

比较 ScalaQuery 和 Squeryl时,Stefan Zeiger(ScalaQuery 的作者)在第三个要点中说:

ScalaQuery 支持一组基本的 JDBC 类型,并且可以使用 DBMS 或特定于应用程序的类型进行扩展。

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

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

如何将 Postgres 类型的列合并gender到 ScalaQuery 模式中?

(如果您认为不同的强类型 O/R 方法更适合该任务,我也将不胜感激。我已经看过 Squeryl,并且不相信它可以处理自定义类型,除非它们作为原语保留在数据库管理系统。)

4

1 回答 1

3
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 Enums 并将其存储为原始类型。

例如:

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);
  }
}

然后在 DB a la 中存储为 char(1) Orders.insert(cardType = cardType.toString),或者您可以创建一个类型映射器 Enum-String 转换并在插入时省略 enum.toString ...

于 2012-06-21T12:21:11.647 回答