Как использовать @Subselect в Hibernate

1

Я пытаюсь работать над примером для @Subselect используя документ Hibernate.

Я создал объекты для Bid и Item следующим образом:

@Entity
public class Bid {
    @Id
    private int id;
    @Column(name="item_id")
    private int itemId;
    @Column
    private int amount;
//getters & setters
}


@Entity
public class Item {
    @Id
    private int id;
    @Column
    private String name;
//getters and setters
}

Я вставил некоторые записи в таблицы базы данных для Bid и Item. Теперь я создал другой объект для тестирования @Subselect как:

@Entity
@Subselect("select item.name name, max(bid.amount) amount, count(*) count " + "from item "
        + "join bid on bid.item_id = item.id " + "group by item.name")
@Synchronize({ "item", "bid" })
// tables impacted
public class Summary {
    @Id @GeneratedValue
    private int id;
    @Column
    private String name;
    @Column
    private String amount;
    @Column
    private String count;
//getters & setters
}

Я новичок в Hibernate, поэтому пытаюсь создать образец программы для тестирования функции @Subselect.

public class AppTest {
    public static void main(String[] args) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();

        //createItemsAndBids(session);
        Summary summary = new Summary();
        session.save(summary);

        session.getTransaction().commit();
        HibernateUtil.getSessionFactory().close();
    }

Когда я запускаю эту программу, я получаю ниже ошибок:

Hibernate: выберите hibernate_sequence.nextval из двойного спящего режима: вставьте в (выберите item.name name, max (bid.amount) сумму, счетчик (*) подсчитайте из заявки на участие в торгах на bid.item_id = item.id group by item.name) (сумма, счет, имя, идентификатор) значения (?,?,?,?) 10 августа 2014 1:24:31 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions WARN: Ошибка SQL: 904, SQLState: 42000 10 августа 2014 1:24:31 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions ERROR: ORA-00904: "ID": неверный идентификатор

Вызывается: java.sql.SQLSyntaxErrorException: ORA-00904: "ID": неверный идентификатор

Пожалуйста, помогите мне, как проверить функцию @Subselect спящего режима

Также я попытался использовать HQL, даже тогда я получаю такую же ошибку:

public class AppTest {
    public static void main(String[] args) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();

        //createItemsAndBids(session);
        Query query = session.createQuery("from Summary");
        List result = query.list();
        System.out.println(result);

        session.getTransaction().commit();
        HibernateUtil.getSessionFactory().close();
    }

Обновление. Ошибка, которую я получаю с этим запросом HQL:

Aug 11, 2014 12:35:07 AM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000232: Schema update complete
Hibernate: select summary0_.id as id1_2_, summary0_.amount as amount2_2_, summary0_.count as count3_2_, summary0_.name as name4_2_ from ( select item.name name, max(bid.amount) amount, count(*) count from item join bid on bid.item_id = item.id group by item.name ) summary0_
Aug 11, 2014 12:35:07 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 904, SQLState: 42000
Aug 11, 2014 12:35:07 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: ORA-00904: "SUMMARY0_"."ID": invalid identifier

Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not extract ResultSet
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:80)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:91)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:2065)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1862)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1838)
    at org.hibernate.loader.Loader.doQuery(Loader.java:909)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:354)
    at org.hibernate.loader.Loader.doList(Loader.java:2553)
    at org.hibernate.loader.Loader.doList(Loader.java:2539)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2369)
    at org.hibernate.loader.Loader.list(Loader.java:2364)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:496)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:387)
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:231)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1264)
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:103)
    at org.hibernate.tutorials.hibernate5.one.AppTest.main(AppTest.java:19)
Теги:
hibernate

1 ответ

4
Лучший ответ

Сводка должна быть неизменной, доступной только для чтения. Нет смысла создавать сводку. Вы можете создавать объекты, создавать ставки, затем запрашивать сводные экземпляры.

EDIT: ошибка довольно ясна. Посмотрите на сгенерированный SQL:

select summary0_.id as id1_2_, summary0_.amount as amount2_2_, summary0_.count as count3_2_, summary0_.name as name4_2_ from ( select item.name name, max(bid.amount) amount, count(*) count from item join bid on bid.item_id = item.id group by item.name ) summary0_

и при ошибке:

ORA-00904: "SUMMARY0_"."ID": invalid identifier

Объект определяет свойство id:

@Id @GeneratedValue
private int id;

но в запросе аннотации Subselect не выбирается какое-либо свойство с именем id:

select item.name name, max(bid.amount) amount, count(*) count from item 
join bid on bid.item_id = item.id 
group by item.name

Вероятно, вы хотите, чтобы ваш запрос был

select item.id id, item.name name, max(bid.amount) amount, count(*) count from item 
join bid on bid.item_id = item.id 
group by item.id, item.name

Также обратите внимание, что аннотация @GeneratedValue не имеет смысла, поскольку вы не можете сохранять экземпляры Сводной информации, и Hibernate, таким образом, никогда не будет генерировать идентификатор для этого объекта.

  • 0
    Благодаря JB, я уже создал некоторые позиции и ставки, а затем попытался использовать HQL для запроса сводных экземпляров, как указано в моем сообщении, но я получаю ту же ошибку, что и я.
  • 0
    Вы не можете иметь ту же ошибку при поиске резюме с использованием HQL. Единственная ошибка, которую вы показываете в своем вопросе, вызвана вашей попыткой вызвать session.save(summary) . Отредактируйте свой вопрос, покажите фактический код, который вы выполняете, и полную трассировку стека полученного исключения.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню