2010-02-27 2 views
1

Я работаю с DataNucleus как часть проекта Google App Engine, и у меня возникают проблемы с постоянством столбцов.DataNucleus Enhancer, JDO и указывающие имена столбцов

@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

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

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

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

+0

Вот эта страница для Querydsl: http://source.mysema.com/display/querydsl/Querydsl –

1

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

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

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

+0

А, я вижу ... поэтому я неправильно понял, что на самом деле делают аннотации.Фактические столбцы поддержки называются аннотациями, в то время как я все еще запрашиваю имена частных членов. Разве такое закрытие не происходит? Я имею в виду, теперь я не могу изменять имена моих переменных, не просматривая все строковые запросы и не изменяя их вручную. Есть ли способ изолировать слово, которое я использую в запросе, от имени частного участника? И, извините, я не перехожу из конвенции 'm_', я ненавижу' this.' gobbledygook. –

+0

Я думаю, вы можете аннотировать геттер и сеттер вместо полей. Тем не менее, если вы переименуете геттер и сеттер, это может оказать глубокое влияние на код (а не только на запрос). Инструменты рефакторинга могут помочь изменить все местоположения, на которые метод ссылается согласованным образом, в том числе в строках. – ewernli

Смежные вопросы