2012-08-17 18 views
6

Ho una query in cui sto unendo due tabelle ROuteMaster e RouteHalts. Quando si esegue inner join sto ottenendoHibernate Query Eccezione di sintassi: org.hibernate.hql.ast.QuerySyntaxException: token imprevisto

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] 

ho cercato attraverso il sito e ho trovato simile domanda e la risposta per esso. la questione di cui era

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

ho metodi getter e setter molti-a-uno mappatura RouteHalts per Routemaster, ho definito per Routemaster a 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" /> 

ma ancora ottenere lo stesso errore. Può piacere che qualcuno mi guidi.

file di mapping

<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 

classe Routemaster pubblico estende persistente {

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 public class estende persistente {

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

}

risposta

8

Non si deve usare esplicitamente "JOIN ON" in HQL. Invece è possibile utilizzare unione implicita in 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 

oppure è possibile utilizzare lo stile Theta per la scrittura di registrazione:

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 

Inoltre è possibile eseguire la query come query SQL nativo, non di query HQL. Per questo si consiglia di utilizzare

session.createSQLQuery(queryText); 

invece di

session.createQuery(queryText); 

E tra l'altro, può essere nel tuo caso in è meglio prendere intera entità, non campi separati (colonne)? Per questo si può utilizzare:

select rm from ... 

Ciò restituirà la List<RouteMaster> invece di List<Object[]>.

+0

Ho scritto come mostrato nel primo esempio, ma ottenendo sempre lo stesso errore. Non posso cambiarlo in SQL poiché questa è una delle condizioni per i criteri di ricerca. Se cambio questo, ho bisogno di rielaborare su tutti quelli. –

+0

Sei sicuro di avere lo stesso errore? – dimas

+0

sì, org.hibernate.hql.ast.QuerySyntaxException: token imprevisto: ON vicino alla riga 1, colonna 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] –

0

Cambia piace la tua query;

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

potresti spiegarmi il join interno usato nella query sopra, INNER JOIN rm.routeHalts AS rh –

+0

@ user1103504 Secondo il tuo file hibernate xml, presumo che RouteMaster abbia molti RouteHalts. Ed è la ragione per cui ho scritto questa query. –

+0

sì hai ragione, ho mappatura molti-a-uno in RouteHalts. Devo definire RouteHalts nel mio percorso RouteMaster con i metodi getter e setter? Può essere una domanda sciocca ma sono nuovo di andare in letargo? –

Problemi correlati