【问题标题】:Why is JOOQ restricted to Integer values and not Longs?为什么 JOOQ 仅限于整数值而不是 Long 值?
【发布时间】:2013-12-11 16:50:40
【问题描述】:

我是 JOOQ 的新手,这似乎有点奇怪,为什么它将我的许多列类型安全地设置为整数,而在不久的将来它们很容易成为 Longs。

即使count(*) 结果也必须转换为整数!

在当前项目中是否有设置默认长或任何方式设置全局长? (这可能适用于任何地方

如果这不可能.. 是否有理由将其设为 Integer?'

这是Scala中的一些代码示例:

def loggedInUserOwnsAccount(userId: Long) = {
selectCount().
  from(LOGGED_IN, EMAIL_ACCOUNT).
  where(LOGGED_IN.USER_ID.equal(EMAIL_ACCOUNT.PASS_ID)).
  and(LOGGED_IN.USER_ID.equal(userId.toInt)).asInstanceOf[ResultQuery[Record]]
}

请注意,重要的部分是我需要使用此代码userId.toInt将Long转换为Int,否则将无法编译

【问题讨论】:

  • 除了DSL.count() 函数,它确实可以返回Long 而不是Integer,你有什么想法,即是什么让你认为有任何这样的事情a "默认为整数"?
  • 我只是找不到从Integer 更改为Long 的明显方法。有一些方法采用 Long 参数,现在我正在从硬编码的 sql 字符串迁移到 jooq,我不想更改接口。所以我现在实际上将 Long 转换为 Integer,如果以后 id 太大,它可能会引发异常。希望我能覆盖你
  • 你能编辑你的问题并展示一个实际的例子吗?我仍然不确定问题是什么......
  • 是的,我只是添加了一个实际示例。谢谢你的提问:)
  • 我明白了,我想我现在明白了……

标签: java sql integer long-integer jooq


【解决方案1】:

在您的数据库中,LOGGED_IN.USER_ID 可能是 SQL 类型 INT,它在 Java Integer 或 Scala Int 中具有最佳等价性。如果您想对Long 进行操作,则应将数据库列的类型更改为BIGINT

没有办法绕过这个“限制”,我认为这是一件好事。例如,您不能将Long 插入INT 数据库列。使用jOOQ,Java / Scala 编译器将防止这种情况意外发生。

使用隐式转换的解决方法

在 Scala 中有解决此类问题的方法。当然,您可以尝试通过扩展现有的jOOQ-scala tools 来应用隐式转换。

trait SNumberField[T <: Number] extends SAnyField[T] {
  // [...]
  def equal(value : Number)        : Condition;
  def equal(value : Field[Number]) : Condition;
}

abstract class NumberFieldBase[T <: Number](override val underlying: Field[T])
    extends AnyFieldBase[T] (underlying)
    with SNumberField[T] {

  // [...]
  def equal(value : Number)
    = underlying.equal(underlying.getDataType().convert(value));
  def equal(value : Field[_ <: Number]) 
    = underlying.equal(value.coerce(underlying.getDataType());
}

【讨论】:

  • 谢谢,这更有意义。所以我想其他类型的数据库助手让我们称它们为anorm 在这些约束上稍微宽松一些。感谢您的澄清
  • @GeorgePligor:好吧,既然你在 Scala 领域,我想你可能会喜欢这种类型安全 :-) 无论如何,我已经用你可能的解决方法更新了我的答案可以申请jOOQ-scala's Conversion.scala
  • 这是方言特有的吗?我从 SQLite 数据库生成代码,我所有的 Integer 列都以 Java int 的形式出现。 SQLite 中的 Ints 最高可达 64 位,并且 SQLite 没有长数据类型。
  • @oillio:我不确定这两件事是否相关,但很难从 Stack Overflow 上的评论中说出来。你介意问一个新的问题吗?我会在那里回答...
猜你喜欢
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
相关资源
最近更新 更多