9

私の Spring / Hibernate / JPA アプリケーションでは、多くの名前付きクエリを使用しています。これらのクエリの 1 つに入力ミスがあると、アプリケーションの起動ログ ファイルに次のようなエラーが表示されます。

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

名前付きクエリだけでなく、名前付きクエリの問題点を出力するように hibernate を構成するにはどうすればよいですか?

UPDATEたとえば、JPA クエリSELECT f FROM Foo WHERE f.v := trueは、クエリが無効であると不平を言う休止状態で失敗します。Hibernate はそこから SQL を生成しようとさえしていません。クエリは正しい JPQL ではありません。= の代わりに := が使用されたため、hibernate にクエリが間違っていると言わせる方法を知りたいです。これが休止状態でオンにできる設定かどうかはわかりません。

4

4 に答える 4

7

Hibernate のカスタム クエリ ローダーはorg.hibernate.loader.custom.sql(Hibernate 3 の場合で、Hibernate 4 にもあるようです) にあります。log4jを使用している場合、ログを出力するには、このパッケージに独自のカテゴリを設定するだけです (コンソール アペンダーを使用すると、その後のエラー ログが関心のあるものと重複する可能性があるため、ファイル アペンダーを使用することをお勧めします)。

<category name="org.hibernate.loader.custom.sql" additivity="false">
    <priority value="trace" />
    <appender-ref ref="fileAppender" />
</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)

その例外は読み込み時に発生していますが、コードの実行中にクエリ エラーが発生することもあります。その場合、後で調べることができるHibernateExceptionまたは類似の例外がスローされます。コロンがない場合、実際にはAbstractQueryImplクラスによってスローされるIllegalArgumentExceptionです。

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
于 2013-10-02T15:34:20.173 に答える
1

私は同様の問題に取り組んでいましたが、Spring Data JPA を使用している場合、エンティティ オブジェクトで @NamedQuery の代わりに DAO インターフェイスで @Query を使用すると、より詳細なエラー メッセージが表示されることがわかりました。したがって、代わりに:

@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();
}

これは同じクエリ言語と式を使用しますが、実装の癖が何であれ、はるかに表現力豊かなエラー メッセージを提供します。

于 2014-08-27T16:55:11.667 に答える
0

あなたが何を求めているかを推測すると、何が悪いのかを教えてくれるのは休止状態ではないと思います。私がこれで成功した唯一の方法はかなり苦痛ですが、少なくともそれはうまくいきます!

したがって、クエリの何が問題になっているのかを示すためにデータベース自体が必要です。これを行うには、上記のように休止状態からのSQL出力を有効にします。次に、お気に入りのツール(squirrelSQL、toad、eclipse-pluginなど)を介してDBに接続します。SQLにパラメーターがない場合は、そこにカットアンドペーストしてSQLを実行すると、役立つはずです。デバッグ。

パラメータがある場合、プロセスは同じですが、はるかに面倒です。ただし、SQLに問題がなければ、データベースはそれが気に入らないことを教えてくれるはずです。ほとんどの場合、これを知ったら、Hibernate側で何を変更する必要があるかが明確になります。時々それは謎かもしれません、しかしそれらのケースのほとんどはここに文書化されています!

于 2012-08-17T11:21:49.373 に答える
0

を設定して、HSQL の印刷を試みることができます。

<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

于 2012-08-17T11:06:12.587 に答える