2012-08-17 60 views
6

我有一個查詢我在哪裏連接兩個表馬路大師和RouteHalts。 當我執行內部聯接我得到Hibernate查詢語法異常:org.hibernate.hql.ast.QuerySyntaxException:意外的標記

org.hibernate.hql.ast.QuerySyntaxException: unexpected token: on near line 1, 

column 169 [SELECT rm.id , rm.routeCode , rm.startPlaceId , rm.endPlaceId , 
rm.active, rm.linkedRoute FROM com.oprs.pojo.routes.RouteMaster rm INNER JOIN 
RouteHalts rh on rm.id = rh.routeId WHERE rh.placeId = :PlaceId 
ORDER BY rm.id ASC] 

我搜索通過該網站,發現類似的問題,併爲它的響應。所提及的問題是

Hibernate: org.hibernate.hql.ast.QuerySyntaxException: unexpected token 

我在RouteHalts

<many-to-one name="RouteMaster" class="com.oprs.pojo.routes.RouteMaster" 
        fetch="join" 
      foreign-key="id" column="ROUTE_ID" insert="false" 
      update="false" lazy="false" /> 

,但仍然得到同樣的錯誤馬路大師多到一個在RouteHalts的馬路大師映射,我已經定義getter和setter方法。可以請一些人指導我。

映射文件

<hibernate-mapping package="com.oprs.pojo.routes"> 
    <!-- Hibernate mapping for RouteMaster table --> 
    <class name="RouteMaster" table="OPRS_ROUTE_MASTER"> 
     <id name="id" column="ROUTE_ID" type="java.lang.Long"> 
      <generator class="assigned" /> 
     </id> 
     <property name="startPlaceId" column="START_PLACE_ID"/> 
     <property name="endPlaceId" column="END_PLACE_ID"/> 
     <property name="routeCode" column="ROUTE_CODE"/> 
     <property name="routeName" column="ROUTE_NAME"/> 
     <property name="active" column="IS_ACTIVE"/> 
     <property name="linkedRoute" column="LINKED_ROUTE"/> 
     <property name="returnRouteId" column="RET_ROUTE_ID"/> 
     <!-- Auditor Information --> 
     <component name="auditor" class="com.oprs.pojo.base.Auditor"> 
      <property name="createdBy" column="CREATED_BY" /> 
      <property name="createdDate" column="CREATED_DATE" /> 
      <property name="modifiedBy" column="MODIFIED_BY" /> 
      <property name="modifiedDate" column="MODIFIED_DATE" /> 
     </component> 
     <many-to-one name="RouteHalts" class="com.oprs.pojo.routes.RouteHalts" fetch="join" 
      foreign-key="routeId" column="ROUTE_ID" insert="false" 
      update="false" lazy="false" /> 
    </class> 

    <!-- Hibernate mapping for RouteHalts table --> 
    <class name="RouteHalts" table="OPRS_ROUTE_HALTS"> 
     <id name="id" column="HALTS_ID" type="java.lang.Long"> 
      <generator class="assigned" /> 
     </id> 
     <property name="routeId" column="ROUTE_ID"/> 
     <property name="placeId" column="PLACE_ID"/> 
     <property name="seqNo" column="SEQ_NO"/> 
     <property name="distanceKM" column="DISTANCE_KM"/> 
     <property name="border" column="IS_BORDER"/> 
     <property name="tolls" column="NO_OF_TOLLS"/>  
     <!-- Auditor Information --> 
     <component name="auditor" class="com.oprs.pojo.base.Auditor"> 
      <property name="createdBy" column="CREATED_BY" /> 
      <property name="createdDate" column="CREATED_DATE" /> 
      <property name="modifiedBy" column="MODIFIED_BY" /> 
      <property name="modifiedDate" column="MODIFIED_DATE" /> 
     </component> 
    </class> 


POJO of Route Master 

公共類馬路大師延伸持久{

private static final long serialVersionUID = -5710336066048392949L; 

private Long startPlaceId; 
private Long endPlaceId; 
private Long returnRouteId; 
private String startPlaceCode; 
private String endPlaceCode; 
private String startPlaceName; 
private String endPlaceName; 
private String routeCode; 
private String routeName; 
private String active; 
private Auditor auditor; 
private boolean revervseRoute; 
private String linkedRoute = AppConstants.N; 
private Map<Double, RouteHalts> haltsMap; 
private RouteHalts routeHalts; 


public RouteHalts getRouteHalts() { 
    return routeHalts; 
} 

public void setRouteHalts(RouteHalts routeHalts) { 
    this.routeHalts = routeHalts; 
} 

public Long getStartPlaceId() { 
    return startPlaceId; 
} 

public void setStartPlaceId(Long startPlaceId) { 
    this.startPlaceId = startPlaceId; 
} 

public Long getEndPlaceId() { 
    return endPlaceId; 
} 

public void setEndPlaceId(Long endPlaceId) { 
    this.endPlaceId = endPlaceId; 
} 

public String getStartPlaceCode() { 
return startPlaceCode; 
} 

public void setStartPlaceCode(String startPlaceCode) { 
this.startPlaceCode = startPlaceCode; 
} 

public String getEndPlaceCode() { 
return endPlaceCode; 
} 

public void setEndPlaceCode(String endPlaceCode) { 
this.endPlaceCode = endPlaceCode; 
} 

public Long getReturnRouteId() { 
    return returnRouteId; 
} 

public void setReturnRouteId(Long returnRouteId) { 
    this.returnRouteId = returnRouteId; 
} 

public String getRouteCode() { 
return routeCode; 
} 

public void setRouteCode(String routeCode) { 
this.routeCode = routeCode; 
} 

public Auditor getAuditor() { 
return auditor; 
} 

public void setAuditor(Auditor auditor) { 
this.auditor = auditor; 
} 

public String getStartPlaceName() { 
    return startPlaceName; 
} 

public void setStartPlaceName(String startPlaceName) { 
    this.startPlaceName = startPlaceName; 
} 

public String getEndPlaceName() { 
    return endPlaceName; 
} 

public void setEndPlaceName(String endPlaceName) { 
    this.endPlaceName = endPlaceName; 
} 

public String getActive() { 
    return active; 
} 

public void setActive(String active) { 
    this.active = active; 
} 

public Map<Double, RouteHalts> getHaltsMap() { 
    return haltsMap; 
} 

public void setHaltsMap(Map<Double, RouteHalts> haltsMap) { 
    this.haltsMap = haltsMap; 
} 

public boolean isRevervseRoute() { 
    return revervseRoute; 
} 

public void setRevervseRoute(boolean revervseRoute) { 
    this.revervseRoute = revervseRoute; 
} 

public String getLinkedRoute() { 
    return linkedRoute; 
} 

public void setLinkedRoute(String linkedRoute) { 
    this.linkedRoute = linkedRoute; 
} 

public String getRouteName() { 
    return routeName; 
} 

public void setRouteName(String routeName) { 
    this.routeName = routeName; 
} 

}

POJO of RouteHalts 

公共類RouteHalts延伸持久{

private static final long serialVersionUID = -1491637903595290895L; 
private Long placeId; 
private Long routeId; 
private String placeCode; 
private Double seqNo; 
private Double distanceKM; 
private boolean border; 
private Auditor auditor; 

private String placeName; 
private String stateCode; 
private String stopType; 
private String departureTime; 
private Integer tolls; 
private String platformNo; 
private Long stopTypeId; 
private Integer linkSequenceNo; 
private String actualTime; 
private int arrivalDay; 

public String getStateCode() { 
    return stateCode; 
} 

public void setStateCode(String stateCode) { 
    this.stateCode = stateCode; 
} 

public Long getRouteId() { 
    return routeId; 
} 

public void setRouteId(Long routeId) { 
    this.routeId = routeId; 
} 

public Long getPlaceId() { 
    return placeId; 
} 

public void setPlaceId(Long placeId) { 
    this.placeId = placeId; 
} 

public String getPlaceCode() { 
return placeCode; 
} 

public void setPlaceCode(String placeCode) { 
this.placeCode = placeCode; 
} 

public Double getDistanceKM() { 
return distanceKM; 
} 

public void setDistanceKM(Double distanceKM) { 
this.distanceKM = distanceKM; 
} 

public boolean isBorder() { 
    return border; 
} 

public void setBorder(boolean border) { 
    this.border = border; 
} 

public Auditor getAuditor() { 
return auditor; 
} 

public void setAuditor(Auditor auditor) { 
this.auditor = auditor; 
} 

public String getPlaceName() { 
    return placeName; 
} 

public void setPlaceName(String placeName) { 
    this.placeName = placeName; 
} 

public Double getSeqNo() { 
    return seqNo; 
} 

public void setSeqNo(Double seqNo) { 
    this.seqNo = seqNo; 
} 

public String getStopType() { 
    return stopType; 
} 

public void setStopType(String stopType) { 
    this.stopType = stopType; 
} 

public String getDepartureTime() { 
    return departureTime; 
} 

public void setDepartureTime(String departureTime) { 
    this.departureTime = departureTime; 
} 

public Integer getTolls() { 
    return tolls; 
} 

public void setTolls(Integer tolls) { 
    this.tolls = tolls; 
} 

public String getPlatformNo() { 
    return platformNo; 
} 

public void setPlatformNo(String platformNo) { 
    this.platformNo = platformNo; 
} 

public Long getStopTypeId() { 
    return stopTypeId; 
} 

public void setStopTypeId(Long stopTypeId) { 
    this.stopTypeId = stopTypeId; 
} 

public Integer getLinkSequenceNo() { 
    return linkSequenceNo; 
} 

public void setLinkSequenceNo(Integer linkSequenceNo) { 
    this.linkSequenceNo = linkSequenceNo; 
} 

public int getArrivalDay() { 
    return arrivalDay; 
} 

public void setArrivalDay(int arrivalDay) { 
    this.arrivalDay = arrivalDay; 
} 

public String getActualTime() { 
    return actualTime; 
} 

public void setActualTime(String actualTime) { 
    this.actualTime = actualTime; 
} 

}

回答

8

您不應該在HQL中使用顯式的「JOIN ON」。相反,你可以使用隱含在HQL加盟:

SELECT rm.id , rm.routeCode , rm.startPlaceId , rm.endPlaceId , rm.active , rm.linkedRoute 
FROM com.abhibus.oprs.pojo.routes.RouteMaster rm 
INNER JOIN rm.routeHalts rh WHERE rh.placeId = :PlaceId ORDER BY rm.id ASC 

,或者您可以使用西塔風格寫作加盟:

SELECT rm.id , rm.routeCode , rm.startPlaceId , rm.endPlaceId , rm.active , rm.linkedRoute 
FROM com.abhibus.oprs.pojo.routes.RouteMaster rm, RouteHalts rh 
WHERE rm.id = rh.routeId AND rh.placeId = :PlaceId ORDER BY rm.id ASC 

您也可以執行查詢的原生SQL查詢,而不是HQL查詢。爲此,您應該使用的

session.createSQLQuery(queryText); 

代替

session.createQuery(queryText); 

順便說一下,可能你的情況在好來獲取整個實體,而不是分開的字段(列)?爲此,您可以使用:

select rm from ... 

這將返回List<RouteMaster> insted的的List<Object[]>

+0

我按照你在第一個例子中所顯示的那樣寫,但仍然得到相同的錯誤。我無法將其更改爲SQL,因爲這是搜索條件的條件之一。如果我改變這一點,那麼我需要對所有這些進行修改。 – 2012-08-17 10:11:51

+0

你確定你得到同樣的錯誤嗎? – dimas 2012-08-17 10:36:04

+0

yes,org.hibernate.hql.ast.QuerySyntaxException:意外標記:在第1行第176列附近顯示[SELECT rm.id,rm.routeCode,rm.startPlaceId,rm.endPlaceId,rm.active,rm.linkedRoute FROM com .oprs.pojo.routes.RouteMaster RM INNER JOIN rm.routeHalts AS rh的ON rm.id = rh.routeId WHERE rh.placeId =:PlaceId ORDER BY RM。id ASC] – 2012-08-17 10:40:30

0

更改您的查詢喜歡這一點;

SELECT rm.id , rm.routeCode , rm.startPlaceId , rm.endPlaceId , rm.active , rm.linkedRoute FROM RouteMaster rm INNER JOIN rm.routeHalts AS rh ON rm.id = rh.routeId WHERE rh.placeId = :PlaceId ORDER BY rm.id ASC 
+0

可否請你解釋一下上面查詢中使用的Inner join,INNER JOIN rm.routeHalts AS rh – 2012-08-17 10:11:02

+0

@ user1103504根據你的hibernate xml文件,我假設RouteMaster有很多RouteHalts.So這就是我寫這個查詢的原因。 – 2012-08-17 10:17:34

+0

是的你是對的,我有RouteHalts多對一的映射。我是否需要在RouteMaster pojo中使用getter和setter方法定義RouteHalts?可能是一個愚蠢的問題,但我是休眠的新手? – 2012-08-17 10:20:12