DataNucleus Enhancer, JDO и указание имен столбцов - PullRequest
1 голос
/ 27 февраля 2010

Я работаю с 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 Мой вопрос: есть ли способ отделить токены, которые я использую в запросе, от имени поля? Я ищу возможность изменять имена полей без необходимости редактировать запросы вручную.

ПРИМЕЧАНИЕ: Я бы скорее использовал свои соглашения об именах SQL в классах Java, чем записывал ужасные объемы XML вручную, поэтому это нужно делать с аннотациями.

Ответы [ 2 ]

2 голосов
/ 27 февраля 2010

Понятия не имею о разговоре об SQL, вы используете GAE / J, следовательно, BigTable, а не RDBMS, поэтому SQL просто не будет работать. @Column, вероятно, ничего не делает, так как это для ORM. Здесь вы используете JDOQL как язык запросов, поэтому вы используете имена полей ... так как это объектно-ориентированный язык запросов. Это НЕ SQL. Ты ненавидишь "это"? JDOQL использует синтаксис Java, поэтому «this» имеет большой смысл.

Если вы действительно хотите иметь безопасное для типов расширение запроса, которое позволяет выполнять рефакторинг, тогда QueryDSL предоставляет JDOQL для использования с DataNucleus.

PS Усилитель DataNucleus не имеет ничего общего с именами столбцов. Он просто добавляет дополнительные методы для обнаружения обновлений полей в соответствии со спецификацией JDO.

1 голос
/ 27 февраля 2010

Не уверен на 100%, что я понял, в чем твоя проблема. Если вы используете m_userName в своем запросе, переводится ли он как user_name в запросе SQL?

Вы выражаете запрос в соответствии с именами и переменными java-классов, и они переводятся для работы в соответствии с таблицей схемы SQL и именами столбцов. Большую часть времени люди хотят этого.

BTW, m_id и m_userName - ужасное соглашение об именах для кода Java. Я настоятельно советую вам следовать обычной конвенции .

...