0

MySQL データベースに 2 つのテーブルがあります。

1- キャンペーン:

  • pkid : 主キー。
  • fk_Content : コンテンツ テーブルの外部キー。
  • tk_DistributionGroup : 型テーブル distribution_group の外部キー。

2- コンテンツ:

  • pkid : 主キー。
  • tk_contentSubtype : 型テーブル distribution_list の外部キー。

CampaignData という Java Bean (Hibernate エンティティではない) があります。

public class CampaignData {

    private long contentId;
    private long contentSubTypeId;
    private Long distributionGroupId;

}

クエリの実行方法は次のとおりです。

CampaignData campaignData = (CampaignData) session
                .createSQLQuery(
                        "select camp.fk_Content as contentId,camp.tk_DistributionGroup as distributionGroupId,cont.tk_contentSubtype as contentSubTypeId "
                                + "from campaign camp,content cont"
                                + " where camp.pkid=:campaignId and camp.fk_Content=cont.pkid")
                .setLong("campaignId", campaignId)
                .setResultTransformer(
                        Transformers.aliasToBean(CampaignData.class))
                .uniqueResult();

これにより、休止状態のクエリが生成されます。

select
        camp.fk_Content as contentId,
        camp.tk_DistributionGroup as distributionGroupId,
        cont.tk_contentSubtype as contentSubTypeId 
    from
        campaign camp,
        content cont 
    where
        camp.pkid=? 
        and camp.fk_Content=cont.pkid

データベースで生成された SQL クエリを試すと、正常に動作し、データは正常に取得されますが、アプリケーションを実行すると例外が発生します。

Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not execute query
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.loader.Loader.doList(Loader.java:2297)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2172)
    at org.hibernate.loader.Loader.list(Loader.java:2167)
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:316)
    at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1832)
    at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165)
    at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:179)
    at org.hibernate.impl.AbstractQueryImpl.uniqueResult(AbstractQueryImpl.java:859)
    at com.xeno.xecamp.desktopManagement.Main.getCampaignSMSs(Main.java:43)
    at com.xeno.xecamp.desktopManagement.Main.main(Main.java:18)
Caused by: java.sql.SQLException: Column 'fk_Content' not found.
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
    at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1144)
    at com.mysql.jdbc.ResultSetImpl.getBigDecimal(ResultSetImpl.java:1414)
    at org.hibernate.type.BigIntegerType.get(BigIntegerType.java:57)
    at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:184)
    at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:210)
    at org.hibernate.loader.custom.CustomLoader$ScalarResultColumnProcessor.extract(CustomLoader.java:501)
    at org.hibernate.loader.custom.CustomLoader$ResultRowProcessor.buildResultRow(CustomLoader.java:447)
    at org.hibernate.loader.custom.CustomLoader.getResultColumnOrRow(CustomLoader.java:344)
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:647)
    at org.hibernate.loader.Loader.doQuery(Loader.java:745)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270)
    at org.hibernate.loader.Loader.doList(Loader.java:2294)
    ... 9 more

例外が発生する理由を教えてください。

更新:これは、別のアプリケーションのデータベースに接続するサード パーティのアプリケーションです。

の他のアプリケーション値hibernate.hbm2ddl.auto=create-drop

4

2 に答える 2

5

それを機能させるには、次のように addScalar を使用する必要がありました。

.createSQLQuery(
                        "select camp.fk_Content as contentId,camp.tk_DistributionGroup as distributionGroupId,cont.tk_contentSubtype as contentSubTypeId "
                                + "from campaign camp,content cont"
                                + " where camp.pkid=:campaignId and camp.fk_Content=cont.pkid")
                .addScalar("contentId")
                .addScalar("distributionGroupId")
                .addScalar("contentSubTypeId")
于 2012-05-15T12:55:54.983 に答える
5

要求したものをデータベースから適切に取得するには、休止状態が使用するエンティティ クラスがデータベース テーブルと 100% 一致する必要があります。

列はありますfk_Contentが、プライベート フィールドはcontentIdです。を使用するだけでasは、目的の結果は得られません。@Column(name = "")別の名前を使用したい場合 (あなたがしたように)、. さらに、基本的なデータ型を使用することはお勧めしません。CampaignData クラスは次のようになります。

@Entity
@Table(name = "campaign")
public class CampaignData {

    private Long contentId;
    private Long contentSubTypeId;
    private Long distributionGroupId;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "pkid", unique = true, nullable = false)
    public Long getContentId() {
        return this.contentId;
    }

    public void setContentId(Long contentId){
        this.contentId = contentId;
    }

    @Column(name = "fk_Content")
    public Long getContentSubTypeId() {
        return this.contentSubTypeId;
    }

    public void setContentSubTypeId(Long contentSubTypeId){
        this.contentSubTypeId= contentSubTypeId;
    }

    @Column(name = "tk_DistributionGroup")
    public Long getDistributionGroupId() {
        return this.distributionGroupId;
    }

    public void setDistributionGroupId(Long distributionGroupId){
        this.distributionGroupId= distributionGroupId;
    }
}

これでうまくいくはずです。また、 Hibernate の Criteria の使い方を学んでみてください。これは、ハードコーディングされた SQL ステートメントよりもはるかに優れた方法です。

于 2012-05-15T12:41:07.513 に答える