在不断的前pressions使用Scala常数 [英] Using scala constants in constant expressions
问题描述
我有常量,这是由其他较小的常量。例如:
I have constants, that are made of other, smaller constants. For example
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
}
我想这是真的,因为常在我的注释中使用它们。
I want these to be true constants because I use them in annotations.
我如何工作的呢? (在斯卡拉2.11)
How do I make it work? (on scala 2.11)
我要的是
interface MyConstants {
String TABLENAME = "table_name";
String FIELDNAME = "field_name";
String INDEXNAME = TABLENAME + "_" + FIELDNAME + "_ix";
}
但在阶。 Scalac不拿起使用常数标注,如果它与Java类/接口编译它们(看SI-5333 ),所以我决定把它们放在一阶对象。它适用于文字,和前pressions用文字,而不是与其他常量前pressions。
but in scala. Scalac does not pick up constants for usage in annotations if it compiles them from java class/interface (see SI-5333) so I decided to put them in a scala object. It works for literals, and for expressions with literals, but not for expressions with other constants.
有了这个code:
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 {
}
我得到线以下错误 =指数...
标注的参数必须是一个常数;发现:MyConstants.INDEXNAME
annotation argument needs to be a constant; found: MyConstants.INDEXNAME
编辑:
的摆弄周围有几个版本的配置后,我觉得这其实是一个斯卡拉的IDE具体问题。当我建项目,或gradle这个SBT的code确实编译好的。我使用的构建工具为我的实际项目,所以它是关于在IDE中有几个INCOM prehensible标记结束 - 烦人,但有一点做与功能的
推荐答案
我用常数JPA使用Scala。这code编译,我用它:
I used constants in JPA with scala. This code compiles, and I used it:
的 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"
}
这篇关于在不断的前pressions使用Scala常数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!