Как применять группы выборки с помощью JDOQL-запросов с помощью datanucleus-appengine 2.0.0-final - PullRequest
1 голос
/ 22 февраля 2012

После обновления до версии 2.0.0 datanucleus-appengine группы выборки теперь, похоже, игнорируются при использовании запросов JDOQL через API запросов. Я не уверен, что это ошибка в библиотеке или я делаю это неправильно.

У меня определена сущность «Пользователь», которая содержит несколько ссылок на список 1: M для других сущностей. Мы контролируем выборку этих ссылок через группы выборки, например:

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable="true")
@FetchGroups({@FetchGroup(name="bits",
                       members=@Persistent(name="userHistory"),
@Persistent(name="userBranding")}),
             @FetchGroup(name="content", members={@Persistent(name="userContent")})})

public class User implements Serializable {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private String username;

    @Persistent
    private String email;

    @Persistent(mappedBy = "contentUser", defaultFetchGroup = "false")
    @Element(dependent = "true")
    @Order(extensions = @Extension(vendorName = "datanucleus", key = "list-ordering",value="contentKey asc"))
    private List<Content> userContent;

    @Persistent(mappedBy = "historyUser", defaultFetchGroup = "false")
    @Element(dependent = "true")
    @Order(extensions = @Extension(vendorName = "datanucleus", key = "list-ordering", value = "createdDate asc"))
    private List<History> userHistory;

    @Persistent(mappedBy = "brandingUser", defaultFetchGroup = "false")
    @Element(dependent = "true")
    private List<MediaBranding> userBranding;
...
}

С приведенным выше определением мое понимание:

  • Ни одно из отношений не извлекается, когда используется только группа извлечения по умолчанию.
  • Если указана группа выборки 'bits', то должны быть выбраны userHistory и userBranding.
  • Если указана группа выборки 'content', должен быть выбран userContent.

При использовании JDOQL для извлечения пользователя по полю электронной почты, независимо от того, какие группы извлечения указаны, ни одно из отношений не извлекается. Если я использую getById () для выборки пользователя, группы выборки применяются, как и ожидалось.

Я отключил кэширование L2 (в jdoquery.xml установлено значение NONE).

Тестовый пример, который я использую для получения, показан ниже (он не работает с версией 2.0.0-final, проходит с версией 1.0.10).

@SuppressWarnings("unchecked")
    @Test
    public void testAddRetrieveUserByJDOQLQueryFetchGroups() {
        PersistenceManager pm;
        User u = persistUserAndFriends();

        pm = getPMF().getPersistenceManager();

        User result = null;
        try {
            pm.getFetchPlan().addGroup("bits");
            pm.getFetchPlan().addGroup("content");
            log.info("Groups in fetch plan: " + pm.getFetchPlan().getGroups());
            Query query = pm.newQuery(User.class);           
            query.setFilter("email == emailParam");
            query.declareParameters("java.lang.String emailParam");
            List<User> results = (List<User>) query.execute("hello@site.net");
            assertEquals(1, results.size());
            result = results.get(0);
            pm.makeTransient(result, true);
        } finally {
            pm.close();
        }
        assertNotNull("User history should be fetched", result.getUserHistory());
        assertNotNull("User branding should be fetched", result.getUserBranding());
        assertEquals("Should be two history children", 2, result.getUserHistory().size());
        assertEquals("Should be two branding children", 2, result.getUserBranding().size());
        assertEquals("Should be a content child", 1, result.getUserContent().size());
    }

Я поступаю неправильно?

...