JPA + DB2无法执行简单查询

时间:2012-07-09 11:22:02

标签: hibernate db2 jt400

EDIT1: 当Hibernate连接到MS-SQL时,所有列和表都在扫描。 Logs

但是当Hibernate连接到DB2时,它正试图再次(渲染)所有包含''i'字母的表和列。 Logs

在我扫描表格和列后,我意识到所有字母都很大。事实上,每一封信都在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 h h h.RDeleted =:arg1”); -

    13:26:38,135 DEBUG SQL:选择holding0_.HoldingId作为HoldingId1_,hold0_.RDeleted为RDeleted1_,hold0_.InsertDate为InsertDate1_,holding0_.SavesUserId为SavesUse4_1_,holding0_.UpdateDate为UpdateDate1_,holding0_.Updater为Updater1_,holding0_。描述为Descript7_1_,hold0_.HoldingName为HoldingN8_1_来自hold holding0_其中holding0_.RDeleted =? Hibernate:选择holding0_.HoldingId作为HoldingId1_,hold0_.RDeleted为RDeleted1_,hold0_.InsertDate为InsertDate1_,holding0_.SavesUserId为SavesUse4_1_,holding0_.UpdateDate为UpdateDate1_,holding0_.Updater为Updater1_,holding0_.Description为Descript7_1_,holding0_.HoldingName为HoldingN8_1_来自holding holding0_ where holding0_.RDeleted =? 13:26:38,428 WARN 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;

3 个答案:

答案 0 :(得分:1)

尝试从“持有h”执行查询。如果它仍然会下降:

  

错误SqlExceptionHelper:检测到未定义的列名。

那么这意味着您使用错误的属性名称映射了列名。


您提到,以下查询有效:

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

您可以通过将所有列逐个添加到select中来追踪导致异常的列。

答案 1 :(得分: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;
    }

答案 2 :(得分:0)

查询qry = em.createQuery(“from h h h.RDeleted =:arg1”); -

不应该是

查询qry = em.createQuery(“从h中选择h,其中h.RDeleted =:arg1”)?