Java 一对多关系的HQL是“给予”;ORA-00936:缺少表达式;例外
我有两个具有一对多关系的表,如下所示:Java 一对多关系的HQL是“给予”;ORA-00936:缺少表达式;例外,java,hibernate,hibernate-onetomany,Java,Hibernate,Hibernate Onetomany,我有两个具有一对多关系的表,如下所示: select a.auditId, a.startTime, a.endTime, a.auditParameterDataSet from AuditDetail a; 我的实体类和hbm配置如下所示: select a.auditId, a.startTime, a.endTime, a.auditParameterDataSet from AuditDetail a; AuditDetail.java public class AuditDet
select a.auditId, a.startTime, a.endTime, a.auditParameterDataSet from AuditDetail a;
我的实体类和hbm配置如下所示:
select a.auditId, a.startTime, a.endTime, a.auditParameterDataSet from AuditDetail a;
AuditDetail.java
public class AuditDetail implements Serializable {
private static final long serialVersionUID = 1L;
private String auditId;
private Timestamp startTime;
private Timestamp endTime;
Set auditParameterDataSet;
public Set getAuditParameterDataSet() {
return auditParameterDataSet;
}
public void setAuditParameterDataSet(Set auditParameterDataSet) {
this.auditParameterDataSet = auditParameterDataSet;
}
public String getAuditId() {
return auditId;
}
public void setAuditId(String auditId) {
this.auditId = auditId;
}
public void setStartTime(Timestamp startTime) {
this.startTime = startTime;
}
public Timestamp getEndTime() {
return endTime;
}
public void setEndTime(Timestamp endTime) {
this.endTime = endTime;
}
}
public class AuditParameter {
private String auditId ;
private String parameterId;
private String fieldName ;
private AuditDetail auditDetail;
public String getAuditId() {
return auditId;
}
public void setAuditId(String auditId) {
this.auditId = auditId;
}
public String getParameterId() {
return parameterId;
}
public void setParameterId(String parameterId) {
this.parameterId = parameterId;
}
public String getFieldName() {
return fieldName;
}
public void setFieldName(String fieldName) {
this.fieldName = fieldName;
}
public AuditDetail auditDetail() {
return auditDetail;
}
public void setAuditDetail(AuditDetail auditDetail) {
this.auditDetail = auditDetail;
}
}
AuditDetail.hbm.xml
<hibernate-mapping>
<class name="com.test.AuditDetail" table="AUDITDETAIL" >
<id name="auditId" column="AUDITID" type="string" />
<property name="startTime" type="java.sql.Timestamp">
<column name="STARTTIME" sql-type="VARCHAR2(50)" />
</property>
<property name="endTime" type="java.sql.Timestamp">
<column name="ENDTIME" sql-type="VARCHAR2(50)" />
</property>
<set name="auditParameterDataSet" cascade="all,delete-orphan" lazy="true" inverse="true">
<key>
<column name="AUDITID"/>
</key>
<one-to-many class="com.test.AuditParameter" />
</set>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.test.AuditParameter" table="AUDITPARAMETER" >
<id name="parameterId" type="string">
<column name="PARAMETERID" sql-type="VARCHAR2(50)" />
</id>
<many-to-one name="auditDetail" class="com.test.AuditDetail" column="AUDITID" insert="false" update="false" lazy="false">
</many-to-one>
<property name="auditId" type="string">
<column name="AUDITID" sql-type="VARCHAR2(50)" not-null="false" />
</property>
<property name="fieldName" type="string">
<column name="FIELDNAME" sql-type="VARCHAR2(50)" />
</property>
</class>
</hibernate-mapping>
AuditParameter.hbm.xml
<hibernate-mapping>
<class name="com.test.AuditDetail" table="AUDITDETAIL" >
<id name="auditId" column="AUDITID" type="string" />
<property name="startTime" type="java.sql.Timestamp">
<column name="STARTTIME" sql-type="VARCHAR2(50)" />
</property>
<property name="endTime" type="java.sql.Timestamp">
<column name="ENDTIME" sql-type="VARCHAR2(50)" />
</property>
<set name="auditParameterDataSet" cascade="all,delete-orphan" lazy="true" inverse="true">
<key>
<column name="AUDITID"/>
</key>
<one-to-many class="com.test.AuditParameter" />
</set>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.test.AuditParameter" table="AUDITPARAMETER" >
<id name="parameterId" type="string">
<column name="PARAMETERID" sql-type="VARCHAR2(50)" />
</id>
<many-to-one name="auditDetail" class="com.test.AuditDetail" column="AUDITID" insert="false" update="false" lazy="false">
</many-to-one>
<property name="auditId" type="string">
<column name="AUDITID" sql-type="VARCHAR2(50)" not-null="false" />
</property>
<property name="fieldName" type="string">
<column name="FIELDNAME" sql-type="VARCHAR2(50)" />
</property>
</class>
</hibernate-mapping>
但当我执行此查询时,它会给我以下错误:
ORA-00936:缺少表达式
下面是我的控制台输出的查询
select au0_.AUDITID as col_0_0_, au0_.STARTTIME as col_1_0_, au0_.ENDTIME as col_2_0_, . as col_3_0_
from AUDITDETAIL au0_ inner join AUDITPARAMETER auditparam4_ on au0_.AUDITID=auditparam4_.AUDITID
根据这个输出,我们可以看到hibernate没有为a.auditParameterDataSet生成列名。为什么会这样?我哪里做错了?您必须使用:-
HQL:-
标准:-
Criteria criteria = session.createCriteria(AuditDetail.class);
criteria.setFetchMode("auditParameterDataSet", FetchMode.EAGER);
谢谢你的回答,加入解决了我的问题。我所做的唯一更改是在查询中将.auditParameterDataSet替换为auditParameterDataSet,并从查询中删除fetch,因为它会给我带来错误,如:查询指定的联接提取,但提取关联的所有者不在选择列表中。请参考并更新您的答案。顺便说一句,从我的结束+1解决我的问题。