gpt4 book ai didi

java - DataNucleus Enhancer、JDO 和指定列名

转载 作者:行者123 更新时间:2023-11-29 06:22:43 26 4
gpt4 key购买 nike

作为 Google App Engine 项目的一部分,我正在使用 DataNucleus,但我在持久性列方面遇到了一些麻烦。

@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: Unexpected expression type while parsing query. Are you certain that a field named user_name exists on your object?

当然,当运行这样的查询时:

Query q = pm.newQuery(User.class,
"m_userName == _username");

...一切都很好。因此,如果这些注释中的任何一个受到尊重,就会有一个名为 user_name 的字段,但显然不是。

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

注意:我宁愿在 Java 类中使用我的 SQL 命名约定,也不愿手动编写数量惊人的 XML,所以这必须通过注释来完成。

最佳答案

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

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

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

关于java - DataNucleus Enhancer、JDO 和指定列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2347631/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com