DataNucleus Enhancer, JDO и указание имен столбцов

Я работаю с 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, если бы какая-либо из этих аннотаций учитывалась, но это явно не так.

ТАК мой вопрос: есть ли способ отделить токены, которые я использую в запросе, от имени поля? Я ищу возможность изменить имена полей без необходимости редактировать запросы вручную.

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


person Travis Gockel    schedule 27.02.2010    source источник


Ответы (2)


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

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

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

person DataNucleus    schedule 27.02.2010
comment
Вот главная страница Querydsl: source.mysema.com/display/querydsl/Querydsl - person Timo Westkämper; 01.03.2010

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

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

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

person ewernli    schedule 27.02.2010
comment
А, понятно... так что я неправильно понял, что на самом деле делают аннотации. Фактические столбцы поддержки называются с помощью аннотаций, в то время как я все еще запрашиваю имена частных членов. Разве это не нарушает инкапсуляцию? Я имею в виду, что теперь я не могу изменять имена своих переменных, не просматривая все строковые запросы и не изменяя их вручную. Есть ли способ изолировать слово, которое я использую в запросе, от имени закрытого члена? И извините, я не отказываюсь от m_ соглашения, я ненавижу this. тарабарщину. - person Travis Gockel; 27.02.2010
comment
Я думаю, вы можете аннотировать геттер и сеттер вместо полей. Тем не менее, если затем вы переименуете геттер и сеттер, это может сильно повлиять на код (не только на запрос). Инструменты рефакторинга могут помочь изменить все места, где на метод ссылаются, согласованным образом, в том числе в строках. - person ewernli; 27.02.2010