1

我正在使用 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如果这些注释中的任何一个被兑现,就会有一个名为的字段,但显然不是。

所以我的问题是:有什么方法可以将我在查询中使用的标记与字段名称分离?我正在寻找无需手动编辑查询即可更改字段名称的能力。

注意:我宁愿在 Java 类中使用我的 SQL 命名约定,也不愿手动编写大量的 XML,因此必须使用注释来完成。

4

2 回答 2

2

不知道谈论 SQL,您使用的是 GAE/J,因此使用的是 BigTable 而不是 RDBMS,因此 SQL 将无法工作。@Column 可能什么都不做,因为它用于 ORM。在这里,您使用 JDOQL 作为查询语言,因此您使用字段名称……因为它是一种面向对象的查询语言。这不是 SQL。你讨厌“这个”?JDOQL 使用 Java 语法,因此“this”很有意义。

如果你真的想要一个允许重构的类型安全的查询扩展,那么 QueryDSL 提供了 JDOQL 以与 DataNucleus 一起使用。

PS DataNucleus 增强器与列名无关。根据 JDO 规范,它只是添加了用于检测字段更新的额外方法。

于 2010-02-27T17:05:24.633 回答
1

不是 100% 确定我明白你的问题是什么。如果您在查询中使用它是否会像在 SQL 查询m_userName中一样被翻译?user_name

您根据 java 类名和变量表达您的查询,并根据 SQL 模式表和列名将它们转换为工作。这是大多数时候人们想要的。

顺便说一句,m_idm_userName是一个糟糕的 Java 代码命名约定。我强烈建议您遵循通常的约定

于 2010-02-27T14:59:35.247 回答