3

実行するクエリが2つあります。

2012-08-07 11:24:02,561 ERROR [org.hibernate.hql.PARSER] (http-0.0.0.0-8080-12) line 1:105: unexpected token: ON
2012-08-07 11:24:02,686 ERROR [org.jboss.aspects.tx.TxPolicy] (http-0.0.0.0-8080-12) javax.ejb.EJBTransactionRolledbackException: org.hibernate.hql.ast.QuerySyntaxException: unexpected token: ON near line 1, column 105 
[SELECT count(o) from ejb.entity.News o LEFT JOIN NewsNewsDistributionServiceLink p ON o.id = p.newsId WHERE o.statusId = ?1 AND p.newsDistServiceCode is ?2]

2012-08-07 11:26:15,605 ERROR [org.hibernate.hql.PARSER] (http-0.0.0.0-8080-12) line 1:105: unexpected token: ON
2012-08-07 11:26:15,609 ERROR [org.jboss.aspects.tx.TxPolicy] (http-0.0.0.0-8080-12) javax.ejb.EJBTransactionRolledbackException: org.hibernate.hql.ast.QuerySyntaxException: unexpected token: ON near line 1, column 105 
[SELECT count(o) from entity.News o LEFT JOIN NewsNewsDistributionServiceLink p ON o.id = p.newsId WHERE o.companyId = ?1 AND o.statusId = ?2 AND p.newsDistServiceCode is ?3]

SQuirreLSQLクライアントで次を実行しました。

select * from news n left join news_news_distribution_service_link nl
on n.id=nl.news_id
where news_distribution_service_code is null

これは結果を返しますが、これをJavaサーブレット用に変換すると、そのエラーがスローされます。

ニューステーブル:

id -PK
company_id
user_id
title
type_id
status_id
location
is_immediate
contents
created_date
last_modified_date
release_date
delete_date
corrected_news_id
can_distribute
was_distributed

NewsNewsDistLinkテーブル:

id -PK 
news_id - this is equal to the id in News
news_distribution_service_code

コード:

String _query = "SELECT COUNT(o) FROM News o " + (filter.tierGroup != null ? TIER_GROUP_JOIN : "") + "WHERE ";
            WhereClauseBuilder builder = getWhereClause(filter);
            _query+= builder.where.toString();

            Query query = em.createQuery(_query);
            query.setHint("org.hibernate.cacheable", true);
            builder.bind(query);

whereClauseBuilder()は基本的に "where"の後にparamsを追加し、bind()は基本的にparamを?#とその値にバインドします。最後に、p.newsDistServiceCodeはほとんどの場合null(> 95%)になります。

4

1 に答える 1

0

クエリはSQLクエリではなく、HQLクエリであるためです。SQLとHQLは2つの異なる言語です。SQLはテーブルと列で機能しますが、HQLはHibernateエンティティとアソシエーションで機能します。

Hibernateのドキュメントを参照してください。

于 2012-08-07T16:42:32.510 に答える