2015-08-03 2 views
0

я получил два Entities:@Reference Объект запроса в морфий, используя 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(); 
} 

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

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 (значение = "идентификатор пользователя", ленивый = истинный) частного учетная_запись_пользователя UserAccount = новый 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); 

Еще réponse получил EMPTY UserAccount данные:

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

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

+0

Не видя StackTrace это будет трудно сказать ... Я не совсем уверен, что ваш второй вопрос о , Что вы подразумеваете под «принудительным исполнением этого ленивого эффекта на мой код?» – evanchooly

+1

Вы пробовали без пробела в названии? Это определенно необычный выбор. – xeraa

+0

@evanchooly вы можете мне предложить, как я могу использовать Lazy в объекте «Ссылка» и привязать его к его родительскому объекту во время извлечения? – Milson

ответ

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(); 
    } 
Смежные вопросы