Я пытаюсь объединить 3 таблицы, чтобы получить необходимую информацию, используя entityManager.createQuery.

Код Littlepet следующим образом:

List<Object[]> o=entityManager.createQuery("SELECT u.loginId,ui.emailId,u.userId,ui.firstName,up.password,ui.phoneNunber,u.roleTypeId"  + " From Users as u,UserInfo ui, UserPassword as up where u.userId = up.userId "    + "AND u.userId=ui.userId").getResultList();

У меня есть компонент с вышеуказанными возвращаемыми полями UserDetails.

public class UserDetails
{
    String LoginId;
    String Email;
    String UserId;
    String FirstName;
    String Password;
    String Mobile;
    String RoleTypeId;
    int Status;

getters() & setters()
}

Но когда я пытаюсь использовать List из UserDetails вместо List из Object[], он говорит ClassCastException.

Как получить / преобразовать возвращенный объект с настроенным бином?

2
Joe 28 Май 2017 в 17:49

2 ответа

Лучший ответ
 List<UserDetails> o=entityManager.createQuery("SELECT new package.UserDetails( u.loginId,ui.emailId,u.userId,ui.firstName,up.password,ui.phoneNunber,u.roleTypeId)"  + " From Users as u,UserInfo ui, UserPassword as up where u.userId = up.userId "    + "AND u.userId=ui.userId").getResultList();

Вам нужно иметь конструктор с параметрами в том же порядке, в котором поля выбираются в запросе, поэтому UserDetails (loginId, emailId, userId, firstName, пароль, phoneNunber, roleTypeId)

Или вы можете использовать свой код, а затем написать конвертер, который преобразует массив объектов в UserDetails .

 List<Object[]> retrievedObjects = //yourCode.
 for (Object[] objs : retrievedObjects) {
      //write convert method which populates **UserDetails** fields from the objects.
      UserDetails ud = convert(objs);
 }
3
Yan Khonski 1 Июн 2017 в 13:07

Вы можете использовать преобразователь результата. Преобразователь результатов является функцией Hibernate (не JPA). Поэтому вам нужно использовать Session или Query из Hibernate.

Что-то вроде этого:

List<UserDetails> result = entityManager.createQuery(
  "SELECT u.loginId as loginId, ui.emailId as emailId ..."
).unwrap(org.hibernate.query.Query.class)
 .setResultTransformer(new AliasToBeanResultTransformer(UserDetails.class))
 .list();

У вас должны быть псевдонимы в HQL: u.loginId as loginId и соответствующие свойства в UserDetails:

class UserDetails
{

  private String loginId;

  public String getLoginId() {
    return loginId;
  }

  public void setLoginId(String loginId) {
    this.loginId = loginId;
  }

}

Примеры трансформаторов: http://jpwh.org/examples/jpwh2/jpwh-2e-examples-20151103/examples/src/test/java/org/jpwh/test/querying/advanced/TransformResults.java

1
v.ladynev 28 Май 2017 в 21:43