繁体   English   中英

DataNucleus Enhancer,JDO和指定列名称

[英]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_idm_userName是Java代码的可怕命名约定。 我强烈建议您遵循通常的惯例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM