@Reference Object Query в Morphia с использованием MongoDB

У меня есть две сущности:

public class UserAccount extends BaseEntity {
    @Expose
    @Property("username")
    @Indexed(value = IndexDirection.ASC, name = "userNameIndex", unique = true)
    private String userName = new String();

    @Expose
    @Property("password")
    private String password = new String();
}

и

public class UserProfile extends BaseEntity {
    @Expose
    @Property("first name")
    @Indexed(value = IndexDirection.ASC, name = "firstNameIndex")
    private String firstName = new String();

    @Expose
    @Property("middle name")
    // @Indexed(value = IndexDirection.ASC, name = "middleNameIndex")
    private String middleName = new String();

    @Expose
    @Property("last name")
    @Indexed(value = IndexDirection.ASC, name = "lastNameIndex")
    private String lastName = new String();

    @Expose
    @Reference(/* idOnly = true, */value = "user id" /* , lazy = true */)
    private UserAccount userAccount = new UserAccount();
}

Я пытаюсь найти всех пользователей на основе искомого имени пользователя (содержит!, но уникально) и UsedProfileObjectId (@Id). Я пытаюсь проверить ограничение при сохранении сведений о пользователе, является ли предоставленное имя пользователя уникальным или нет? (Мне нужно проверить это как в новых случаях добавления, так и в случаях обновления). Итак, я попытался закодировать это:

public List<UserProfile> findAllUsersWithSameUserName(ObjectId id,
            String userName) {
        Datastore ds = getDatastore();
        Query<UserProfile> profileQuery = ds.createQuery(UserProfile.class);
        Query<UserAccount> accountQuery = ds.createQuery(UserAccount.class);
        accountQuery.criteria("username").containsIgnoreCase(userName);
        container.add(profileQuery.criteria("user id").in(
                accountQuery.asKeyList()));

        return profileQuery.asList();
    }

Но этот код показывает

java.lang.NullPointerException

  1. Я что-то упустил в коде?
  2. Также я пытаюсь обеспечить соблюдение

@Reference(value = "идентификатор пользователя", lazy = true) private UserAccount userAccount = new UserAccount();

Но я понятия не имею, как перепривязать этот объект без данных?

Я пытался сделать это:

        user = userProfileDAO.findUserByProfileID(id);
        user.getUserAccount();
        user.getUserAccount().getUserName();
        user.getUserAccount().getPassword();

        // Gson gson = new Gson();
        // .setDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz").create();
        Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd")
                .excludeFieldsWithoutExposeAnnotation().setPrettyPrinting()
                .create();
        response = gson.toJson(user, UserProfile.class);

Тем не менее, ответ получил EMPTY данные учетной записи пользователя:

"userAccount": {
    "userName": "",
    "password": "",
    "isDeleted": false,
    "isActive": false,
    "addedOn": "2015-08-06"
  },

Хотя при проверке я могу получить такие фактические данные: user.getUserAccount().getUserName() Не удалось найти хороший пример использования lazy=true и в Morphia? Как я могу применить этот ленивый эффект к моему коду?


person Milson    schedule 03.08.2015    source источник
comment
Не видя трассировки стека, будет трудно сказать... Я не совсем уверен, о чем ваш второй вопрос. Что вы подразумеваете под принудительным применением этого ленивого эффекта в моем коде?   -  person evanchooly    schedule 03.08.2015
comment
Вы пробовали без пробела в имени свойства? Это определенно необычный выбор   -  person xeraa    schedule 03.08.2015
comment
@evanchooly, можете ли вы предложить мне, как я могу использовать Lazy для ссылочного объекта и связать его с его родительским объектом во время выборки?   -  person Milson    schedule 07.08.2015
comment
@xeraa, можете ли вы предложить мне, как я могу использовать Lazy для ссылочного объекта и связать его с его родительским объектом во время выборки?   -  person Milson    schedule 07.08.2015
comment
аннотации немного объясняют это.   -  person evanchooly    schedule 07.08.2015


Ответы (1)


Вот как нужно выполнять запрос объекта @Reference:

public UserProfile findAllUsersWithSameUserName(ObjectId id, String userName) {
        Datastore ds = getDatastore();

        Query<UserProfile> profileQuery = ds.createQuery(UserProfile.class);
        Query<UserAccount> accountQuery = ds.createQuery(UserAccount.class);
        accountQuery.criteria("username").hasThisOne(userName.toString());
        profileQuery.and(profileQuery.criteria("_id").notEqual(id),
                profileQuery.criteria("user id").in(accountQuery.asKeyList()));
        return profileQuery.get();
    }
person Milson    schedule 03.08.2015