首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ScalaQuery O/R框架中映射自定义类型

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

Stack Overflow用户
提问于 2012-06-21 10:19:49
回答 1查看 1.2K关注 0票数 2

在他的ScalaQuery与Squeryl的比较中,Stefan Zeiger (“ScalaQuery”的作者)在第三个要点中说:

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

然而,我一直无法找到实例或解释如何实际做到这一点。我试图为Postgres数据库编写一个ScalaQuery模式,其中有些列是我在Postgres中创建的自定义枚举类型。

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

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

(如果你认为另一种强类型的O/R方法更适合于这项任务,我也会很感激。我已经看过Squeryl,并且不相信它能够处理自定义类型,除非它们作为原语保存在DBMS中。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-21 12:21:11

代码语言:javascript
复制
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 (或运行查询的任何地方)中,使用它:

代码语言:javascript
复制
import TypeMapper._
implicit val j2Stamp = joda2Stamp // type conversion automatically

您需要对enum和PostGres‘enum存储类型进行同样的实验。我倾向于不麻烦,更喜欢使用Java并将其存储为原语类型。

例如:

代码语言:javascript
复制
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)的形式存储在DB a la Orders.insert(cardType = cardType.toString)中,或者您可以创建一个类型映射器Enum-String转换,并省略插入时的enum.toString .

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11136078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档