0

編集1: HibernateがMS-SQLに接続すると、すべての列とテーブルがスキャンされます。ログ

しかし、HibernateがDB2に接続すると、「i」文字を含むすべてのテーブルと列を再度作成(レンダリング)しようとします。ログ

表と列をスキャンした後、すべての文字が大きいことに気付きました。実際、DB2ではすべての文字が大きいことに気付きました。Hibernateは照会に小文字を使用し、DB2は文字の感度が高いため、列名を認識しません。そのため、以下のアラームが発生します。

WARN SqlExceptionHelper: SQL Error: -99999, SQLState: 42703 
15:15:22,025 ERROR SqlExceptionHelper: An undefined column name was detected.

どうすればこの問題を解決できますか?


jpaを使用してdb2のテーブルからデータを取得する必要があります。エンティティマネージャを使用してクエリを実行しようとすると、問題が正確にどこにあるのかわからないというエラーが発生します。 私のコードはMS-SQLとHSQL-DBで実行されています...しかし、DB2にメッセージエラーを接続します:*

  • クエリqry=em.createQuery( "from Holding h where h.RDeleted =:arg1");-

    13:26:38,135 DEBUG SQL:holding0_.HoldingIdをHoldingId1_として、holding0_.RDeletedをRDeleted1_として、holding0_.InsertDateをInsertDate1_として、holding0_.SavesUserIdをSavesUse4_1_として、holding0_.UpdateDateをUpdateDate1_として、holding0_.UpdateDateをUpdater1_として、holding0_.UpdaterをUpdater1_として選択します。 、holding0_.HoldingName as HoldingN8_1_ from Holdingholding0_ここでholding0_.RDeleted=?Hibernate:holding0_.HoldingIdをHoldingId1_として、holding0_.RDeletedをRDeleted1_として、holding0_.InsertDateをInsertDate1_として、holding0_.SavesUserIdをSavesUse4_1_として、holding0_.UpdateDateをUpdateDate1_として、holding0_.UpdaterをUpdater1_として、holding0_.UpdaterをUpdater1_として、holding0_.DescriptionをDescript7_1として選択します。保持からholding0_ここでholding0_.RDeleted=?13:26:38,428警告SqlExceptionHelper:SQLエラー:-99999、SQLState:42703 13:26:38,428エラーSqlExceptionHelper:

しかし、クエリは機能します。

Select h.holdingId, h.holdingName, h.description from Holding h

私のデータソース:

<bean class="org.apache.commons.dbcp.BasicDataSource" id="dataSourceDB2_JT400" destroy-method="close">
        <property value="com.ibm.as400.access.AS400JDBCDriver" name="driverClassName"/> 
        <property value="jdbc:as400://192.168.1.1/GULERP" name="url"/> 
        <property value="user" name="username"/> 
        <property value="PW" name="password"/> 
        <property value="5" name="initialSize"/>
    </bean>

私のentityManager:

<bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="erp" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="true" />
                <property name="generateDdl" value="false" />
                <property name="databasePlatform" value="org.hibernate.dialect.DB2400Dialect" />
            </bean>
        </property>
        <property name="dataSource" ref="dataSourceDB2_JT400"/>
    </bean>

および私のドメイン:

@Entity
@AccessType("field")
@Table(name = "Holding", uniqueConstraints = {@UniqueConstraint(columnNames={"HoldingName"})})
public class Holding extends BaseClass implements Serializable {

    transient static final long serialVersionUID = 5473887143181971744L;

    @Id
    @Column(name = "HoldingId", nullable = false, length=36)
    @GeneratedValue(generator="system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
    private String holdingId;

    @Basic(optional = false)
    @Column(name = "HoldingName", nullable = false, length = 100)
    private String holdingName;

    @Column(name = "Description", length = 210)
    private String description;

    @OneToMany(mappedBy = "holdingId", fetch = FetchType.LAZY)
    private List<Company> companyList;
4

3 に答える 3

1

クエリ「from Holding h」を実行してみてください。それでもドロップする場合:

エラー SqlExceptionHelper: 未定義の列名が検出されました。

それは、列名を間違ったプロパティ名でマッピングしたことを意味します。


あなたは、次のクエリが機能することを述べました:

Select h.holdingId, h.holdingName, h.description from Holding h

すべての列を1つずつselectに追加することで、例外の原因となっている列を追跡できます。

于 2012-07-09T13:28:26.700 に答える
1

解決:

    @Override
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public List<HoldingDto> getHoldingList()
    {
        List<HoldingDto> holdLst = null;
        try
        {
            String aa = (String) q.getSingleResult();

            CriteriaBuilder cb = em.getCriteriaBuilder();
            CriteriaQuery<HoldingDto> q = cb.createQuery(HoldingDto.class);
            Root<Holding> h = q.from(Holding.class);
            q.select(cb.construct(HoldingDto.class, h.get("holdingId"), h.get("holdingName"), h.get("description"), h.get("savesUserId"), h.get("insertDate"),
                    h.get("updateDate"), h.get("updater"), h.get("RDeleted")));
            holdLst = em.createQuery(q).getResultList();
        } 
        catch(NoResultException e)
        {
            e.printStackTrace();
        }
        catch (Exception e)
        {
            throw new RuntimeException(e);
        }

        return holdLst;
    }
于 2012-07-11T14:13:04.710 に答える
0

クエリqry=em.createQuery( "from Holding h where h.RDeleted =:arg1");-

あるべきではない

クエリqry=em.createQuery( "select h from Holding h where h.RDeleted =:arg1")?

于 2012-07-09T13:10:52.940 に答える