[英]DataNucleus Enhancer, JDO and Specifying Column Names
我正在使用DataNucleus作为Google App Engine项目的一部分,但是在持久性方面存在一些麻烦。
@PrimaryKey(column = "user_id")
@Column(name = "user_id")
@Persistent(name = "user_id", column = "user_id", valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key m_id;
@Column(name = "user_name")
@Persistent(name = "user_name", column = "user_name")
private String m_userName;
如果您不知道,我试图用不同于变量名称的名称来命名该列,因为我有两种命名约定(一种在Java中更好,另一种在SQL中更好)。 无论如何,我已经尝试了所有这些标记注释的变体,但是DataNucleus增强器拒绝兑现它们中的任何一个,因此当我运行如下查询时:
Query q = pm.newQuery(User.class,
"user_name == _username");
我总是收到这样的错误:
org.datanucleus.store.appengine.FatalNucleusUserException:解析查询时出现意外的表达式类型。 您确定对象上存在一个名为user_name的字段吗?
当然,当运行这样的查询时:
Query q = pm.newQuery(User.class,
"m_userName == _username");
...一切都很好。 因此,如果这些注释中的任何一个得到了user_name
,都会有一个名为user_name
的字段,但显然不是。
所以我的问题是:有什么方法可以将查询中使用的令牌与字段名称分离? 我正在寻找无需手动编辑查询即可更改字段名称的功能。
注意:我将很快在Java类中使用我的SQL命名约定,而不是手工编写大量的XML,因此必须使用批注来完成。
不知道SQL的话题,您使用的是GAE / J,因此使用的是BigTable,而不是RDBMS,因此SQL无法使用。 @Column可能不执行任何操作,因为它适用于ORM。 在这里,您使用的是JDOQLas查询语言,因此您使用字段名...,因为它是一种面向对象的查询语言。 这不是SQL。 您讨厌“这个”吗? JDOQL使用Java语法,因此“ this”很有意义。
如果您确实想要具有允许重构的类型安全的查询扩展,则QueryDSL提供JDOQL以便与DataNucleus一起使用。
PS DataNucleus增强器与列名无关。 根据JDO规范,它只是添加了用于检测字段更新的其他方法。
不能100%确定我能解决您的问题。 如果在查询中使用m_userName
,在SQL查询中是否将其转换为user_name
?
您根据Java类名称和变量表示查询,然后根据SQL模式表和列名称将它们转换为可工作的名称。 这是大多数时候人们想要的。
BTW, m_id
和m_userName
是Java代码的可怕命名约定。 我强烈建议您遵循通常的惯例 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.