2012-07-09 103 views
0

编辑1: 当Hibernate连接到MS-SQL时,所有列和表都在扫描。 LogsJPA + DB2无法执行简单查询

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

我扫描我意识到,所有的字母是big.In事实表和列后,每一个字母是在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(“持有H其中h.RDeleted =: ARG1" ); -

    13:26:38135 DEBUG SQL:选择holding0_.HoldingId如HoldingId1_,holding0_.RDeleted如RDeleted1_,holding0_.InsertDate如InsertDate1_,holding0_.SavesUserId如SavesUse4_1_,holding0_.UpdateDate如UpdateDate1_,holding0_。更新程序为Updater1_,将0_.Description保存为Descript7_1_,将Holding_0_.HoldingName保存为HoldingN8_1_来自Holding holding0_,其中holding0_.RDeleted =? Hibernate:选择hold0_.HoldingId作为HoldingId1_,保持0_.RDeleted为RDeleted1_,保持0_.InsertDate为InsertDate1_,保持0_.SavesUserId为SavesUse4_1_,保持0_.UpdateDate为UpdateDate1_,保持0_.Updater为Updater1_,保持0_.Description为Descript7_1_,保持0_.HoldingName为HoldingN8_1_ Holding Holding0_ where hold0_.RDeleted =? 13:26:38428 WARN SqlExceptionHelper:SQL错误:-99999,SQLSTATE:42703 13:26:38428 ERROR 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; 
+0

比较在查询中的所有列名在表中的所有列名,并找出哪一个是错误或丢失。 – 2012-07-09 11:38:27

+0

我查过了,列名都是正确的。查询执行,如果我手动写入列名称。并且我在DB2客户端上检查了hibernate查询,查询被执行。 – SaRPaRDa 2012-07-09 11:48:06

+0

向我们展示您执行查询的代码以及实体的完整映射。 – 2012-07-09 11:55:26

回答

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; 
    } 
0

查询QRY = em.createQuery( “从持有H其中h.RDeleted =:ARG1”); -

不应它是

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

+1

Hibernate并不关心是否指定了“select h”,它会自动选择根实体。 – JMelnik 2012-07-09 13:22:42

+0

我试过但没有工作。 – SaRPaRDa 2012-07-09 13:24:04

1

尝试执行查询“from Holding h”。如果它仍然会下降:

ERROR SqlExceptionHelper: An undefined column name was detected.

那么这意味着您将您的列名映射到属性名称错误。


你所提到的,下面的查询工作:

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

你可以跟踪列通过添加所有列逐个放入选择引起异常。

+0

如果我将所有列名写入查询,hibernate runnig。但新的错误信息:http://chopapp.com/#lzijtk2d – SaRPaRDa 2012-07-09 13:57:23

+0

java.lang.NumberFormatException:对于输入字符串:“holdingId”... – JMelnik 2012-07-09 15:21:05

+0

NumberFormatException解决。查询qry = em.createQuery(“来自Holding h,其中h.RDeleted =:arg1”,Holding.class); , – SaRPaRDa 2012-07-09 21:08:50