Получить экземпляр Hibernate Entity из столбца id в результате SQLQuery - PullRequest
0 голосов
/ 28 апреля 2009

У меня есть (не спящие) таблицы базы данных, которые содержат идентификаторы для сущностей Hibernate. Я могу запросить их (используя createSQLQuery), что дает мне идентификаторы, из которых я могу затем загрузить сущности.

Я бы хотел сделать это за один шаг, и я думаю, что смогу сделать это с addEntity, но я не уверен, как именно. (Веб-сайт документации Hibernate не работает. Снова.) Я могу использовать addEntity, когда присутствуют все столбцы для таблицы сущностей, но у меня есть только идентификатор.

Это жалуется на отсутствующие столбцы:

return (List<MyEntity>) session.createSQLQuery(
            "select entity_id from the_table where foreign_key_value = ?")
            .addEntity("entity_id", MyEntity.class)
            .setLong(0, foreignKey).list();

Ответы [ 3 ]

1 голос
/ 27 мая 2009

Я думаю, вы хотите что-то вроде:

session.createSQLQuery("select {entity.*} from entity_table {entity} where ....")
  .addEntity("entity", Entity.class).(bind-parameters).list();

Hibernate расширит "{entity. *}" До соответствующих столбцов из entity_table.

Хотя, если у вас уже есть идентификаторы, вы можете просто использовать session.load (), чтобы преобразовать их в реальные экземпляры (ну, прокси с отложенной загрузкой).

0 голосов
/ 28 апреля 2009

Для оракула диалект. Если у вас есть проблема с отображением типа столбца базы данных в тип данных Java, вы можете установить его вручную следующим образом: .addScalar("integerFieldName", Hibernate.INTEGER)

public class LookupCodeName
{
    private String code;
    private String name;

 /*... getter-setters ... */
}

public class someBL {

public List<LookupCodeName> returnSomeEntity() {
      SQLQuery sqlQuery =  (SQLQuery)((HibernateSession)em).getHibernateSession()
                .createSQLQuery( "SELECT st.name as name, st.code as code FROM someTable st")
                .addScalar("code")
                .addScalar("name")
.setResultTransformer(Transformers.aliasToBean(LookupCodeName.class));
    }
return (List<LookupCodeName>)sqlQuery.list();
}
0 голосов
/ 28 апреля 2009

я бы использовал соединение

select * 
from entity_table 
where entity_id = (select entity_id
                   from non_hibernate_table
                   where id = ?)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...