Пользовательское сопоставление классов Hibernate

Когда я выбираю пользователей с помощью этого кода, он работает так, как хотелось бы.

 public List<Users> getActiveUsers(User user) {
    EntityManager entityManager = getEntityManager();
   List<User> Users = new ArrayList();
    try {
        users = entityManager.createQuery("select e from User e where  e.deleted = :deleted", User.class)
                .setParameter("deleted", false)                 
                .getResultList();
    } finally {
        entityManager.close();
    }
    return users;
}

Но если я попытаюсь получить только одного пользователя, используя следующий код, это не удастся.

User user = (User) entityManager.createQuery("select e from User e where  e.deleted = :deleted")
                .setParameter("deleted", false)+                 
                .getSingleResult();

Я не могу получить сопоставленного пользователя, исключение: «не могу преобразовать com.project.model.User в com.project.model.User»


person Marcel Caferati    schedule 12.05.2017    source источник
comment
Можете ли вы попробовать использовать entityManager.createQuery(query, User.class)? Где вы это развертываете?   -  person Arturo Volpe    schedule 12.05.2017
comment
Я пробовал, тот же результат. Где я размещаю? Не уверен, понимаю ли я, что он находится на локальном хосте, и метод вызывается в классе userRepositoryCustom.   -  person Marcel Caferati    schedule 12.05.2017
comment
Какой сервер приложений вы используете, похоже, это проблема, связанная с загрузчиком классов. Также попробуйте добавить в свой запрос setMaxResults(1).   -  person Arturo Volpe    schedule 12.05.2017
comment
Я использую Glassfish   -  person Marcel Caferati    schedule 12.05.2017
comment
Можете добавить лог?   -  person Arturo Volpe    schedule 12.05.2017
comment
Я получаю такую ​​ошибку: Can not pass an instance of "class com.project.model.User (loaded by instance of sun.misc.Launcher$AppClassLoader(id=8597))" to an instance of "class com.project.model.User (loaded by instance of org.springframework.boot.devtools.restart.classloader.Restar‌​tClassLoader(id=1241‌​4))"   -  person Marcel Caferati    schedule 14.05.2017


Ответы (2)


Вы забыли указать тип класса User.class:

entityManager.createQuery("SELECT u FROM User u where  u.deleted = :deleted", User.class)
             .setParameter("deleted", false).getSingleResult();

Ваш метод:

 public User getActiveUser(User user) {
    EntityManager entityManager = getEntityManager();      
    try {
        User user = (User) = entityManager.createQuery
                           ("SELECT u FROM User u WHERE u.deleted = :deleted", User.class)
                           .setParameter("deleted", false).getSingleResult();
    } finally {
        entityManager.close();
    }
    return user;
}
  • Посмотрите на первый пример, вы используете класс Users и на второго пользователя (без S в конце)
  • Вы должны быть осторожны с этим запросом, потому что они могут возвращать более одной записи.
person ℛɑƒæĿᴿᴹᴿ    schedule 12.05.2017
comment
Я пробовал как с кастингом (User), так и с добавлением User.class - person Marcel Caferati; 12.05.2017
comment
Я пробовал это, и это ошибка, которую я получаю Can not pass an instance of "class com.project.model.User (loaded by instance of sun.misc.Launcher$AppClassLoader(id=8597))" to an instance of "class com.project.model.User (loaded by instance of org.springframework.boot.devtools.restart.classloader.RestartClassLoader(id=12414))" - person Marcel Caferati; 14.05.2017

Судя по всему, в коде не было ничего плохого. Я обнаружил, что проблема была такой же, как у этого парня:

Проблема загрузчика классов, связанная с spring-boot-devtools

однако файл .properties со ссылкой на бульдозер у меня не работал. Мне удалось запустить свой код, удалив spring-devtools из проекта. Думаю, я могу жить без живой перезагрузки!

person Marcel Caferati    schedule 14.05.2017