我正在使用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
的字段,但它们显然不是。
SO 我的问题是:有没有办法从字段名称中解析我在查询中使用的标记?我正在寻找能够更改字段名称的功能,而无需手动编辑查询。
注意:我很快就会在Java类中使用我的SQL命名约定,而不是手工编写大量的XML,因此必须使用注释完成。
答案 0 :(得分:2)
不知道SQL的说法,你使用的是GAE / J,因此BigTable而不是RDBMS,所以SQL就行不通。 @Column可能没有任何作用,因为它是针对ORM的。在这里,您使用JDOQL作为查询语言,因此您使用字段名称...因为它是面向对象的查询语言。这不是SQL。你讨厌“这个”? JDOQL使用Java语法,因此“this”很有意义。
如果你真的想要一个允许重构的类型安全的查询扩展,那么QueryDSL提供JDOQL用于DataNucleus。
PS DataNucleus增强器与列名无关。根据JDO规范,它只是增加了检测字段更新的额外方法。
答案 1 :(得分:1)
不是100%肯定我得到了你的问题。如果在查询中使用m_userName
,它会在SQL查询中翻译为user_name
吗?
您根据java类名称和变量表达查询,并根据SQL模式表和列名称将其转换为工作。这是人们想要的大部分时间。
BTW,m_id
和m_userName
是Java代码的可怕命名约定。我强烈建议你按照惯例convention。