Сегодня, добавив очередную небольшую функцию в свое приложение Google App Engine получил очередной жестокий облом:
08.10.2011 21:55:38 org.datanucleus.store.query.AbstractJDOQLQuery <init>
WARNING: Candidate class for JDOQL single-string query (Commander) could not be resolved
Потратив массу времени выяснил
Вот так работает:
Query query = pm.newQuery(Commander.class);
query.setFilter("name == nameParam");
query.declareParameters("String nameParam");
Вот так нет:
Query query = pm.newQuery("select from Commander " +
"where name == nameParam " +
"parameters String nameParam");
И тот и другой код один в один повторяют примеры из руководства. Так какого же хрена?
Ларчик открылся просто. Во втором случае вместо простого имени класса должно стоять полное, т.е. включая имя пакета. В связи с чем мне остается только сказать большое человеческое спасибо людям писавшим документацию для разработчиков - они сделали мою жизнь интереснее.
Продолжение не заставило себя ждать.
Имеется некий класс Owner, содержащий коллекцию классов Commander. Так вот с тех пор как Owner заимел эту коллекцию, экземпляры Commander'ов перестали записываться в БД. Ныне и присно они просто обязаны быть прописаны в эту самую коллекцию. И записываются только когда сохраняешь Owner.
В этом можно усмотреть определенную логику, если бы не одно НО.
Какого лешего они молча иммитируют запись, никак не оповещая программиста о невозможности такой операции? Пожалели лишний раз выдать исключение?
Для полного щастья - если коллекция изначально пустая (именно пустая, а не null) и Owner был записан в БД, а потом считан и тут я хочу что-то в коллекцию поместить... вот тут выясняется что коллекции то тю-тю.... Решается это только созданием пустой коллекции в конструкторе по умолчанию, что совсем не очевидно (скажем для меня совсем не очевидно почему создание коллекции при описании переменных не работает, а в конструкторе по умолчанию - работает, хотя обычно это эквивалентно).
Комментариев нет:
Отправить комментарий