2012-07-09 105 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