在常量表达式中使用scala常量

时间:2014-05-16 12:59:57

标签: scala annotations constants

我有常量,由其他较小的常量组成。例如

object MyConstants {
    final val TABLENAME = "table_name";
    final val FIELDNAME = "field_name";
    final val INDEXNAME = TABLENAME + "_" + FIELDNAME + "_ix"; // this one does not want to be constant
}

我希望这些是真正的常量,因为我在注释中使用它们。

如何让它发挥作用? (关于scala 2.11)

我想要的是

interface MyConstants {
    String TABLENAME = "table_name";
    String FIELDNAME = "field_name";
    String INDEXNAME = TABLENAME + "_" + FIELDNAME + "_ix";
}

但是在scala中。如果Scalac从java类/接口(see SI-5333)编译它们,它不会在注释中选择常量,因此我决定将它们放在scala对象中。它适用于文字和带文字的表达式,但不适用于具有其他常量的表达式。

使用此代码:

import javax.persistence.Entity
import javax.persistence.Table
import org.hibernate.annotations.Index

object MyConstants {
    final val TABLENAME = "table_name";
    final val FIELDNAME = "field_name";
    final val INDEXNAME = TABLENAME + "_" + FIELDNAME + "_ix";
}

@Entity
@Table(name = MyConstants.TABLENAME)
@org.hibernate.annotations.Table(
    appliesTo = MyConstants.TABLENAME,
    indexes = Array(new Index(name = MyConstants.INDEXNAME, columnNames = Array(MyConstants.FIELDNAME)))) 
class MyEntity {
}

我在第indexes = ...

上收到以下错误
  

注释参数需要是常量;发现:MyConstants.INDEXNAME

编辑: 在摆弄了一些构建配置之后,我认为这实际上是一个特定于scala-ide的问题。当我使用gradle或sbt构建项目时,代码确实可以正常编译。我确实使用构建工具来实现我的实际项目,所以最后它在IDE中有一些难以理解的标记 - 很烦人,但与功能无关。

1 个答案:

答案 0 :(得分:3)

我在JPA中使用scala中的常量。这段代码编译,我用它:

FreeDays.scala

@Entity
@Table(name = "free_days")
@NamedQueries(
  Array(
    new NamedQuery(name = JpaQueries.IS_FREE_DAYS, query = "SELECT f FROM FreeDays f WHERE f.dateOfFreeDay = :" + JpaQueries.DATE)
  )
)
class FreeDays {

  def this(id: Int, name: String, dateOfFreeDay: Date) = {
    this()
    this.id = id
    this.name = name
    this.dateOfFreeDay = dateOfFreeDay
  }

  @Id
  @GeneratedValue
  var id: Long = _

  var name: String = _

  @Column(name = "date_of_free_day")
  @Temporal(TemporalType.DATE)
  var dateOfFreeDay: Date = _
}

JpaQueries.scala

object JpaQueries extends JpaQueries

sealed trait JpaQueries {
  final val IS_FREE_DAYS = "IS_FREE_DAYS"
  final val DATE = "date"
}