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;
答案 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”)?