How to get hibernate to print out whats wrong with a named query?

How to get hibernate to print out whats wrong with a named query?

在我的 Spring / Hibernate / JPA 应用程序中,我使用了很多命名查询,当我在其中一个查询中出现拼写错误时,会在我的应用程序启动日志文件中看到类似于下面的错误。

Caused by: org.hibernate.HibernateException: Errors in named queries: FindAllCompanyFileTypes

  at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:426)

  at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872)

  at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:906)

  ... 70 more
<category name="org.hibernate.loader.custom.sql" additivity="false">

  <priority value="trace" />

  

</category>

17:27:18,348 TRACE SQLCustomQuery:85 -   starting processing of sql query [SELECT equipment.*, det.*

    FROM tdetectable_equipment equipment JOIN

    tdetectable det

    ON det.id = equipment.id_detectable

    WHERE

    equipment.id_detectable=det.id and det.active=1 and

    equipment.id_warehouse_container = :_Id]

17:27:18,358 TRACE SQLCustomQuery:85 -   starting processing of sql query [select line.* from tpacking_slip_line line join tpacking_slip slip on line.id_packing_slip = slip.id where line.id_detectable = :detectableId and line.id_related_packing_slip_line is null and slip.`type`= :slipType order by slip.date desc;]

17:27:18,359 TRACE SQLQueryReturnProcessor:387 -   mapping alias [line] to entity-suffix [0_]

17:27:18,364 TRACE SQLCustomQuery:85 -   starting processing of sql query [select res.* from tdetectable det join tpacking_slip_line line on det.id=line.id_detectable and line.id_related_packing_slip_line is null join tpacking_slip slip on line.id_packing_slip = slip.id and slip.`type`='OUT' join vreservation res on slip.id_reservation=res.id where det.id in ( :detIds ) group by(res.id) order by count(res.id) desc;]

17:27:18,365 TRACE SQLQueryReturnProcessor:387 -   mapping alias [res] to entity-suffix [0_]

17:27:18,368 ERROR SessionFactoryImpl:424 -   Error in named query: equipmentWarehouseQuery

org.hibernate.MappingException: Unknown collection role: com.mycompany.model.container.Container.detectables

  at org.hibernate.impl.SessionFactoryImpl.getCollectionPersister(SessionFactoryImpl.java:701)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.addCollection(SQLQueryReturnProcessor.java:393)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processCollectionReturn(SQLQueryReturnProcessor.java:428)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processReturn(SQLQueryReturnProcessor.java:358)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.process(SQLQueryReturnProcessor.java:171)

  at org.hibernate.loader.custom.sql.SQLCustomQuery.<init>(SQLCustomQuery.java:87)

  at org.hibernate.engine.query.NativeSQLQueryPlan.<init>(NativeSQLQueryPlan.java:67)

  at org.hibernate.engine.query.QueryPlanCache.getNativeSQLQueryPlan(QueryPlanCache.java:166)

  at org.hibernate.impl.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:589)

  at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:413)

  at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872)

  at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:863)

  at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:782)

  at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:188)

  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1541)

  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1479)

  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
java.lang.IllegalArgumentException: No positional parameters in query: SELECT equipment.*, det.*

    FROM tdetectable_equipment equipment JOIN

    tdetectable det

    ON det.id = equipment.id_detectable

    WHERE

    equipment.id_detectable=det.id and det.active=1 and

    equipment.id_container = _Id@Entity

@Table

@NamedQueries({@NamedQuery(name="MyEntity.myQuery" query="select blah blah blah")})

public class MyEntity

{

...

}
@Entity

@Table

public class MyEntity

{

...

}



public interface MyEntityDao

  extends JpaRepository...

{

  @Query("select blah blah blah")

  MyEntity findByMyQuery();

}

<property name="show_sql">true</property>

如何配置hibernate来打印出命名查询出了什么问题,而不仅仅是命名查询有错误?

UPDATE 例如,JPA 查询 SELECT f FROM Foo WHERE f.v := true 将失败,hibernate 抱怨查询无效。 Hibernate 甚至没有尝试从中生成 SQL,查询不正确 JPQL。我想知道的是如何让hibernate状态说查询是错误的,因为使用 := 而不是 = ?不确定这是否可以在hibernate状态下打开。


Hibernate 自定义查询加载器的内容位于 org.hibernate.loader.custom.sql 中(对于 Hibernate 3,似乎也适用于 Hibernate 4)。如果使用 log4j,只需将此包设置为自己的类别即可打印日志(我建议您使用文件附加程序,因为如果使用控制台附加程序,之后的错误日志可能会与您感兴趣的内容重叠)。

Caused by: org.hibernate.HibernateException: Errors in named queries: FindAllCompanyFileTypes

  at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:426)

  at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872)

  at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:906)

  ... 70 more
<category name="org.hibernate.loader.custom.sql" additivity="false">

  <priority value="trace" />

  

</category>

17:27:18,348 TRACE SQLCustomQuery:85 -   starting processing of sql query [SELECT equipment.*, det.*

    FROM tdetectable_equipment equipment JOIN

    tdetectable det

    ON det.id = equipment.id_detectable

    WHERE

    equipment.id_detectable=det.id and det.active=1 and

    equipment.id_warehouse_container = :_Id]

17:27:18,358 TRACE SQLCustomQuery:85 -   starting processing of sql query [select line.* from tpacking_slip_line line join tpacking_slip slip on line.id_packing_slip = slip.id where line.id_detectable = :detectableId and line.id_related_packing_slip_line is null and slip.`type`= :slipType order by slip.date desc;]

17:27:18,359 TRACE SQLQueryReturnProcessor:387 -   mapping alias [line] to entity-suffix [0_]

17:27:18,364 TRACE SQLCustomQuery:85 -   starting processing of sql query [select res.* from tdetectable det join tpacking_slip_line line on det.id=line.id_detectable and line.id_related_packing_slip_line is null join tpacking_slip slip on line.id_packing_slip = slip.id and slip.`type`='OUT' join vreservation res on slip.id_reservation=res.id where det.id in ( :detIds ) group by(res.id) order by count(res.id) desc;]

17:27:18,365 TRACE SQLQueryReturnProcessor:387 -   mapping alias [res] to entity-suffix [0_]

17:27:18,368 ERROR SessionFactoryImpl:424 -   Error in named query: equipmentWarehouseQuery

org.hibernate.MappingException: Unknown collection role: com.mycompany.model.container.Container.detectables

  at org.hibernate.impl.SessionFactoryImpl.getCollectionPersister(SessionFactoryImpl.java:701)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.addCollection(SQLQueryReturnProcessor.java:393)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processCollectionReturn(SQLQueryReturnProcessor.java:428)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processReturn(SQLQueryReturnProcessor.java:358)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.process(SQLQueryReturnProcessor.java:171)

  at org.hibernate.loader.custom.sql.SQLCustomQuery.<init>(SQLCustomQuery.java:87)

  at org.hibernate.engine.query.NativeSQLQueryPlan.<init>(NativeSQLQueryPlan.java:67)

  at org.hibernate.engine.query.QueryPlanCache.getNativeSQLQueryPlan(QueryPlanCache.java:166)

  at org.hibernate.impl.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:589)

  at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:413)

  at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872)

  at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:863)

  at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:782)

  at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:188)

  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1541)

  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1479)

  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
java.lang.IllegalArgumentException: No positional parameters in query: SELECT equipment.*, det.*

    FROM tdetectable_equipment equipment JOIN

    tdetectable det

    ON det.id = equipment.id_detectable

    WHERE

    equipment.id_detectable=det.id and det.active=1 and

    equipment.id_container = _Id@Entity

@Table

@NamedQueries({@NamedQuery(name="MyEntity.myQuery" query="select blah blah blah")})

public class MyEntity

{

...

}
@Entity

@Table

public class MyEntity

{

...

}



public interface MyEntityDao

  extends JpaRepository...

{

  @Query("select blah blah blah")

  MyEntity findByMyQuery();

}

<property name="show_sql">true</property>

假设您的根记录器显示文件中的每个错误,这就是您在查询加载时得到的错误输出:

Caused by: org.hibernate.HibernateException: Errors in named queries: FindAllCompanyFileTypes

  at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:426)

  at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872)

  at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:906)

  ... 70 more
<category name="org.hibernate.loader.custom.sql" additivity="false">

  <priority value="trace" />

  

</category>

17:27:18,348 TRACE SQLCustomQuery:85 -   starting processing of sql query [SELECT equipment.*, det.*

    FROM tdetectable_equipment equipment JOIN

    tdetectable det

    ON det.id = equipment.id_detectable

    WHERE

    equipment.id_detectable=det.id and det.active=1 and

    equipment.id_warehouse_container = :_Id]

17:27:18,358 TRACE SQLCustomQuery:85 -   starting processing of sql query [select line.* from tpacking_slip_line line join tpacking_slip slip on line.id_packing_slip = slip.id where line.id_detectable = :detectableId and line.id_related_packing_slip_line is null and slip.`type`= :slipType order by slip.date desc;]

17:27:18,359 TRACE SQLQueryReturnProcessor:387 -   mapping alias [line] to entity-suffix [0_]

17:27:18,364 TRACE SQLCustomQuery:85 -   starting processing of sql query [select res.* from tdetectable det join tpacking_slip_line line on det.id=line.id_detectable and line.id_related_packing_slip_line is null join tpacking_slip slip on line.id_packing_slip = slip.id and slip.`type`='OUT' join vreservation res on slip.id_reservation=res.id where det.id in ( :detIds ) group by(res.id) order by count(res.id) desc;]

17:27:18,365 TRACE SQLQueryReturnProcessor:387 -   mapping alias [res] to entity-suffix [0_]

17:27:18,368 ERROR SessionFactoryImpl:424 -   Error in named query: equipmentWarehouseQuery

org.hibernate.MappingException: Unknown collection role: com.mycompany.model.container.Container.detectables

  at org.hibernate.impl.SessionFactoryImpl.getCollectionPersister(SessionFactoryImpl.java:701)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.addCollection(SQLQueryReturnProcessor.java:393)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processCollectionReturn(SQLQueryReturnProcessor.java:428)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processReturn(SQLQueryReturnProcessor.java:358)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.process(SQLQueryReturnProcessor.java:171)

  at org.hibernate.loader.custom.sql.SQLCustomQuery.<init>(SQLCustomQuery.java:87)

  at org.hibernate.engine.query.NativeSQLQueryPlan.<init>(NativeSQLQueryPlan.java:67)

  at org.hibernate.engine.query.QueryPlanCache.getNativeSQLQueryPlan(QueryPlanCache.java:166)

  at org.hibernate.impl.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:589)

  at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:413)

  at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872)

  at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:863)

  at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:782)

  at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:188)

  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1541)

  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1479)

  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
java.lang.IllegalArgumentException: No positional parameters in query: SELECT equipment.*, det.*

    FROM tdetectable_equipment equipment JOIN

    tdetectable det

    ON det.id = equipment.id_detectable

    WHERE

    equipment.id_detectable=det.id and det.active=1 and

    equipment.id_container = _Id@Entity

@Table

@NamedQueries({@NamedQuery(name="MyEntity.myQuery" query="select blah blah blah")})

public class MyEntity

{

...

}
@Entity

@Table

public class MyEntity

{

...

}



public interface MyEntityDao

  extends JpaRepository...

{

  @Query("select blah blah blah")

  MyEntity findByMyQuery();

}

<property name="show_sql">true</property>

加载时会引发该异常,但您在执行代码时也可能出现查询错误。在这种情况下,会引发 HibernateException 或类似情况,您可以稍后对其进行检查。对于缺少冒号的情况,它实际上是 AbstractQueryImpl 类抛出的 IllegalArgumentException:

Caused by: org.hibernate.HibernateException: Errors in named queries: FindAllCompanyFileTypes

  at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:426)

  at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872)

  at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:906)

  ... 70 more
<category name="org.hibernate.loader.custom.sql" additivity="false">

  <priority value="trace" />

  

</category>

17:27:18,348 TRACE SQLCustomQuery:85 -   starting processing of sql query [SELECT equipment.*, det.*

    FROM tdetectable_equipment equipment JOIN

    tdetectable det

    ON det.id = equipment.id_detectable

    WHERE

    equipment.id_detectable=det.id and det.active=1 and

    equipment.id_warehouse_container = :_Id]

17:27:18,358 TRACE SQLCustomQuery:85 -   starting processing of sql query [select line.* from tpacking_slip_line line join tpacking_slip slip on line.id_packing_slip = slip.id where line.id_detectable = :detectableId and line.id_related_packing_slip_line is null and slip.`type`= :slipType order by slip.date desc;]

17:27:18,359 TRACE SQLQueryReturnProcessor:387 -   mapping alias [line] to entity-suffix [0_]

17:27:18,364 TRACE SQLCustomQuery:85 -   starting processing of sql query [select res.* from tdetectable det join tpacking_slip_line line on det.id=line.id_detectable and line.id_related_packing_slip_line is null join tpacking_slip slip on line.id_packing_slip = slip.id and slip.`type`='OUT' join vreservation res on slip.id_reservation=res.id where det.id in ( :detIds ) group by(res.id) order by count(res.id) desc;]

17:27:18,365 TRACE SQLQueryReturnProcessor:387 -   mapping alias [res] to entity-suffix [0_]

17:27:18,368 ERROR SessionFactoryImpl:424 -   Error in named query: equipmentWarehouseQuery

org.hibernate.MappingException: Unknown collection role: com.mycompany.model.container.Container.detectables

  at org.hibernate.impl.SessionFactoryImpl.getCollectionPersister(SessionFactoryImpl.java:701)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.addCollection(SQLQueryReturnProcessor.java:393)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processCollectionReturn(SQLQueryReturnProcessor.java:428)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processReturn(SQLQueryReturnProcessor.java:358)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.process(SQLQueryReturnProcessor.java:171)

  at org.hibernate.loader.custom.sql.SQLCustomQuery.<init>(SQLCustomQuery.java:87)

  at org.hibernate.engine.query.NativeSQLQueryPlan.<init>(NativeSQLQueryPlan.java:67)

  at org.hibernate.engine.query.QueryPlanCache.getNativeSQLQueryPlan(QueryPlanCache.java:166)

  at org.hibernate.impl.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:589)

  at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:413)

  at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872)

  at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:863)

  at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:782)

  at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:188)

  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1541)

  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1479)

  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
java.lang.IllegalArgumentException: No positional parameters in query: SELECT equipment.*, det.*

    FROM tdetectable_equipment equipment JOIN

    tdetectable det

    ON det.id = equipment.id_detectable

    WHERE

    equipment.id_detectable=det.id and det.active=1 and

    equipment.id_container = _Id@Entity

@Table

@NamedQueries({@NamedQuery(name="MyEntity.myQuery" query="select blah blah blah")})

public class MyEntity

{

...

}
@Entity

@Table

public class MyEntity

{

...

}



public interface MyEntityDao

  extends JpaRepository...

{

  @Query("select blah blah blah")

  MyEntity findByMyQuery();

}

<property name="show_sql">true</property>

我正在处理一个类似的问题,我发现,如果您使用 Spring Data JPA,您可以在 DAO 接口中使用 @Query 而不是在实体对象中使用 @NamedQuery,您会收到更详细的错误消息.所以,而不是:

Caused by: org.hibernate.HibernateException: Errors in named queries: FindAllCompanyFileTypes

  at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:426)

  at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872)

  at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:906)

  ... 70 more
<category name="org.hibernate.loader.custom.sql" additivity="false">

  <priority value="trace" />

  

</category>

17:27:18,348 TRACE SQLCustomQuery:85 -   starting processing of sql query [SELECT equipment.*, det.*

    FROM tdetectable_equipment equipment JOIN

    tdetectable det

    ON det.id = equipment.id_detectable

    WHERE

    equipment.id_detectable=det.id and det.active=1 and

    equipment.id_warehouse_container = :_Id]

17:27:18,358 TRACE SQLCustomQuery:85 -   starting processing of sql query [select line.* from tpacking_slip_line line join tpacking_slip slip on line.id_packing_slip = slip.id where line.id_detectable = :detectableId and line.id_related_packing_slip_line is null and slip.`type`= :slipType order by slip.date desc;]

17:27:18,359 TRACE SQLQueryReturnProcessor:387 -   mapping alias [line] to entity-suffix [0_]

17:27:18,364 TRACE SQLCustomQuery:85 -   starting processing of sql query [select res.* from tdetectable det join tpacking_slip_line line on det.id=line.id_detectable and line.id_related_packing_slip_line is null join tpacking_slip slip on line.id_packing_slip = slip.id and slip.`type`='OUT' join vreservation res on slip.id_reservation=res.id where det.id in ( :detIds ) group by(res.id) order by count(res.id) desc;]

17:27:18,365 TRACE SQLQueryReturnProcessor:387 -   mapping alias [res] to entity-suffix [0_]

17:27:18,368 ERROR SessionFactoryImpl:424 -   Error in named query: equipmentWarehouseQuery

org.hibernate.MappingException: Unknown collection role: com.mycompany.model.container.Container.detectables

  at org.hibernate.impl.SessionFactoryImpl.getCollectionPersister(SessionFactoryImpl.java:701)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.addCollection(SQLQueryReturnProcessor.java:393)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processCollectionReturn(SQLQueryReturnProcessor.java:428)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processReturn(SQLQueryReturnProcessor.java:358)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.process(SQLQueryReturnProcessor.java:171)

  at org.hibernate.loader.custom.sql.SQLCustomQuery.<init>(SQLCustomQuery.java:87)

  at org.hibernate.engine.query.NativeSQLQueryPlan.<init>(NativeSQLQueryPlan.java:67)

  at org.hibernate.engine.query.QueryPlanCache.getNativeSQLQueryPlan(QueryPlanCache.java:166)

  at org.hibernate.impl.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:589)

  at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:413)

  at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872)

  at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:863)

  at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:782)

  at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:188)

  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1541)

  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1479)

  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
java.lang.IllegalArgumentException: No positional parameters in query: SELECT equipment.*, det.*

    FROM tdetectable_equipment equipment JOIN

    tdetectable det

    ON det.id = equipment.id_detectable

    WHERE

    equipment.id_detectable=det.id and det.active=1 and

    equipment.id_container = _Id@Entity

@Table

@NamedQueries({@NamedQuery(name="MyEntity.myQuery" query="select blah blah blah")})

public class MyEntity

{

...

}
@Entity

@Table

public class MyEntity

{

...

}



public interface MyEntityDao

  extends JpaRepository...

{

  @Query("select blah blah blah")

  MyEntity findByMyQuery();

}

<property name="show_sql">true</property>

你会说

Caused by: org.hibernate.HibernateException: Errors in named queries: FindAllCompanyFileTypes

  at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:426)

  at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872)

  at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:906)

  ... 70 more
<category name="org.hibernate.loader.custom.sql" additivity="false">

  <priority value="trace" />

  

</category>

17:27:18,348 TRACE SQLCustomQuery:85 -   starting processing of sql query [SELECT equipment.*, det.*

    FROM tdetectable_equipment equipment JOIN

    tdetectable det

    ON det.id = equipment.id_detectable

    WHERE

    equipment.id_detectable=det.id and det.active=1 and

    equipment.id_warehouse_container = :_Id]

17:27:18,358 TRACE SQLCustomQuery:85 -   starting processing of sql query [select line.* from tpacking_slip_line line join tpacking_slip slip on line.id_packing_slip = slip.id where line.id_detectable = :detectableId and line.id_related_packing_slip_line is null and slip.`type`= :slipType order by slip.date desc;]

17:27:18,359 TRACE SQLQueryReturnProcessor:387 -   mapping alias [line] to entity-suffix [0_]

17:27:18,364 TRACE SQLCustomQuery:85 -   starting processing of sql query [select res.* from tdetectable det join tpacking_slip_line line on det.id=line.id_detectable and line.id_related_packing_slip_line is null join tpacking_slip slip on line.id_packing_slip = slip.id and slip.`type`='OUT' join vreservation res on slip.id_reservation=res.id where det.id in ( :detIds ) group by(res.id) order by count(res.id) desc;]

17:27:18,365 TRACE SQLQueryReturnProcessor:387 -   mapping alias [res] to entity-suffix [0_]

17:27:18,368 ERROR SessionFactoryImpl:424 -   Error in named query: equipmentWarehouseQuery

org.hibernate.MappingException: Unknown collection role: com.mycompany.model.container.Container.detectables

  at org.hibernate.impl.SessionFactoryImpl.getCollectionPersister(SessionFactoryImpl.java:701)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.addCollection(SQLQueryReturnProcessor.java:393)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processCollectionReturn(SQLQueryReturnProcessor.java:428)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processReturn(SQLQueryReturnProcessor.java:358)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.process(SQLQueryReturnProcessor.java:171)

  at org.hibernate.loader.custom.sql.SQLCustomQuery.<init>(SQLCustomQuery.java:87)

  at org.hibernate.engine.query.NativeSQLQueryPlan.<init>(NativeSQLQueryPlan.java:67)

  at org.hibernate.engine.query.QueryPlanCache.getNativeSQLQueryPlan(QueryPlanCache.java:166)

  at org.hibernate.impl.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:589)

  at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:413)

  at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872)

  at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:863)

  at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:782)

  at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:188)

  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1541)

  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1479)

  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
java.lang.IllegalArgumentException: No positional parameters in query: SELECT equipment.*, det.*

    FROM tdetectable_equipment equipment JOIN

    tdetectable det

    ON det.id = equipment.id_detectable

    WHERE

    equipment.id_detectable=det.id and det.active=1 and

    equipment.id_container = _Id@Entity

@Table

@NamedQueries({@NamedQuery(name="MyEntity.myQuery" query="select blah blah blah")})

public class MyEntity

{

...

}
@Entity

@Table

public class MyEntity

{

...

}



public interface MyEntityDao

  extends JpaRepository...

{

  @Query("select blah blah blah")

  MyEntity findByMyQuery();

}

<property name="show_sql">true</property>

这使用相同的查询语言和表达式,但是,无论实现的怪癖如何,都会提供更具表现力的错误消息。


如果我猜测你在问什么,我认为 hibernate 不能告诉你什么是错误的。我成功的唯一方法是相当痛苦,但至少它有效!

所以你需要数据库本身来告诉你查询出了什么问题。为此,您可以如上所述从hibernate中启用 sql 输出。然后你通过你最喜欢的工具连接到数据库:squirrelSQL、toad、eclipse-plugin 等。现在如果你的 sql 中没有参数,那么你只需剪切并粘贴到那里,执行 sql,它应该会帮助你调试。

如果你有参数,过程是一样的,只是更乏味!然而,一旦你的 SQL 没问题,数据库就会告诉你它不喜欢什么。在大多数情况下,一旦你知道了这一点,你就会清楚在hibernate端需要改变什么。虽然有时这可能是一个谜,但大多数情况都记录在这里!


您可以尝试通过设置

来打印HSQL

Caused by: org.hibernate.HibernateException: Errors in named queries: FindAllCompanyFileTypes

  at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:426)

  at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872)

  at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:906)

  ... 70 more
<category name="org.hibernate.loader.custom.sql" additivity="false">

  <priority value="trace" />

  

</category>

17:27:18,348 TRACE SQLCustomQuery:85 -   starting processing of sql query [SELECT equipment.*, det.*

    FROM tdetectable_equipment equipment JOIN

    tdetectable det

    ON det.id = equipment.id_detectable

    WHERE

    equipment.id_detectable=det.id and det.active=1 and

    equipment.id_warehouse_container = :_Id]

17:27:18,358 TRACE SQLCustomQuery:85 -   starting processing of sql query [select line.* from tpacking_slip_line line join tpacking_slip slip on line.id_packing_slip = slip.id where line.id_detectable = :detectableId and line.id_related_packing_slip_line is null and slip.`type`= :slipType order by slip.date desc;]

17:27:18,359 TRACE SQLQueryReturnProcessor:387 -   mapping alias [line] to entity-suffix [0_]

17:27:18,364 TRACE SQLCustomQuery:85 -   starting processing of sql query [select res.* from tdetectable det join tpacking_slip_line line on det.id=line.id_detectable and line.id_related_packing_slip_line is null join tpacking_slip slip on line.id_packing_slip = slip.id and slip.`type`='OUT' join vreservation res on slip.id_reservation=res.id where det.id in ( :detIds ) group by(res.id) order by count(res.id) desc;]

17:27:18,365 TRACE SQLQueryReturnProcessor:387 -   mapping alias [res] to entity-suffix [0_]

17:27:18,368 ERROR SessionFactoryImpl:424 -   Error in named query: equipmentWarehouseQuery

org.hibernate.MappingException: Unknown collection role: com.mycompany.model.container.Container.detectables

  at org.hibernate.impl.SessionFactoryImpl.getCollectionPersister(SessionFactoryImpl.java:701)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.addCollection(SQLQueryReturnProcessor.java:393)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processCollectionReturn(SQLQueryReturnProcessor.java:428)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processReturn(SQLQueryReturnProcessor.java:358)

  at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.process(SQLQueryReturnProcessor.java:171)

  at org.hibernate.loader.custom.sql.SQLCustomQuery.<init>(SQLCustomQuery.java:87)

  at org.hibernate.engine.query.NativeSQLQueryPlan.<init>(NativeSQLQueryPlan.java:67)

  at org.hibernate.engine.query.QueryPlanCache.getNativeSQLQueryPlan(QueryPlanCache.java:166)

  at org.hibernate.impl.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:589)

  at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:413)

  at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872)

  at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:863)

  at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:782)

  at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:188)

  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1541)

  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1479)

  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
java.lang.IllegalArgumentException: No positional parameters in query: SELECT equipment.*, det.*

    FROM tdetectable_equipment equipment JOIN

    tdetectable det

    ON det.id = equipment.id_detectable

    WHERE

    equipment.id_detectable=det.id and det.active=1 and

    equipment.id_container = _Id@Entity

@Table

@NamedQueries({@NamedQuery(name="MyEntity.myQuery" query="select blah blah blah")})

public class MyEntity

{

...

}
@Entity

@Table

public class MyEntity

{

...

}



public interface MyEntityDao

  extends JpaRepository...

{

  @Query("select blah blah blah")

  MyEntity findByMyQuery();

}

<property name="show_sql">true</property>

然后在 log4j 中添加适当的日志级别以显示 org.hibernate 的 DEBUG 或 TRACE 级别日志记录。*

更多信息在这里:http://docs.jboss.org/hibernate/core/3.5/reference/en/html/session-configuration.html#configuration-logging


相关推荐

  • Spring部署设置openshift

    Springdeploymentsettingsopenshift我有一个问题让我抓狂了三天。我根据OpenShift帐户上的教程部署了spring-eap6-quickstart代码。我已配置调试选项,并且已将Eclipse工作区与OpehShift服务器同步-服务器上的一切工作正常,但在Eclipse中出现无法消除的错误。我有这个错误:cvc-complex-type.2.4.a:Invali…
    2025-04-161
  • 检查Java中正则表达式中模式的第n次出现

    CheckfornthoccurrenceofpatterninregularexpressioninJava本问题已经有最佳答案,请猛点这里访问。我想使用Java正则表达式检查输入字符串中特定模式的第n次出现。你能建议怎么做吗?这应该可以工作:MatchResultfindNthOccurance(intn,Patternp,CharSequencesrc){Matcherm=p.matcher…
    2025-04-161
  • 如何让 JTable 停留在已编辑的单元格上

    HowtohaveJTablestayingontheeditedcell如果有人编辑JTable的单元格内容并按Enter,则内容会被修改并且表格选择会移动到下一行。是否可以禁止JTable在单元格编辑后转到下一行?原因是我的程序使用ListSelectionListener在单元格选择上同步了其他一些小部件,并且我不想在编辑当前单元格后选择下一行。Enter的默认绑定是名为selectNext…
    2025-04-161
  • Weblogic 12c 部署

    Weblogic12cdeploy我正在尝试将我的应用程序从Tomcat迁移到Weblogic12.2.1.3.0。我能够毫无错误地部署应用程序,但我遇到了与持久性提供程序相关的运行时错误。这是堆栈跟踪:javax.validation.ValidationException:CalltoTraversableResolver.isReachable()threwanexceptionatorg.…
    2025-04-161
  • Resteasy Content-Type 默认值

    ResteasyContent-Typedefaults我正在使用Resteasy编写一个可以返回JSON和XML的应用程序,但可以选择默认为XML。这是我的方法:@GET@Path("/content")@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})publicStringcontentListRequestXm…
    2025-04-161
  • 代码不会停止运行,在 Java 中

    thecodedoesn'tstoprunning,inJava我正在用Java解决项目Euler中的问题10,即"Thesumoftheprimesbelow10is2+3+5+7=17.Findthesumofalltheprimesbelowtwomillion."我的代码是packageprojecteuler_1;importjava.math.BigInteger;importjava…
    2025-04-161
  • Out of memory java heap space

    Outofmemoryjavaheapspace我正在尝试将大量文件从服务器发送到多个客户端。当我尝试发送大小为700mb的文件时,它显示了"OutOfMemoryjavaheapspace"错误。我正在使用Netbeans7.1.2版本。我还在属性中尝试了VMoption。但仍然发生同样的错误。我认为阅读整个文件存在一些问题。下面的代码最多可用于300mb。请给我一些建议。提前致谢publicc…
    2025-04-161
  • Log4j 记录到共享日志文件

    Log4jLoggingtoaSharedLogFile有没有办法将log4j日志记录事件写入也被其他应用程序写入的日志文件。其他应用程序可以是非Java应用程序。有什么缺点?锁定问题?格式化?Log4j有一个SocketAppender,它将向服务发送事件,您可以自己实现或使用与Log4j捆绑的简单实现。它还支持syslogd和Windows事件日志,这对于尝试将日志输出与来自非Java应用程序…
    2025-04-161