【问题标题】:unexpected token error in hibernate with Java使用 Java 休眠时出现意外的令牌错误
【发布时间】:2017-12-06 10:34:03
【问题描述】:

我有 Route Entity 类,当我要在 HQL 查询中从该表中获取所有数据时,我得到一个只有一列的错误。

Route.class :-

@Entity
public class Route {

    @Id
    private long routeID;

    private String start;
    private String end;
    private String routeNo;
    private double startLat;
    private double startLon;
    private double endLat;
    private double endLon;
}

DataFetch.Class :-

public class DataFetch{

    public void FetchRoutes(){

        Query q = session.createQuery("select routeID,routeNo,start,end from Route ");
        List<Object[]> routes = (List<Object[]>) q.list();

        for (Object[] r : routes) {
            System.out.println("id: "+r[0]);
            System.out.println("No: "+r[1]);
            System.out.println("start: "+r[2]);
            System.out.println("end: "+r[3]);
        }
    }
}

在 DataFetch.class 中,如果我从查询 q 中删除“end”列,则没有错误。但是如果我再次添加 end ,如图所示这个问题,它会给出一个错误。 下面我将我的错误显示为屏幕截图。

Click here to see my Error

有什么问题?

【问题讨论】:

  • END 是保留字?尝试引用它,例如"end"...
  • "end" 可能是保留字。尝试转义:stackoverflow.com/questions/5686412/…
  • end 是 HQL/SQL 关键字,因此您可能需要对其进行转义。
  • 感谢您的帮助!

标签: java hibernate hql


【解决方案1】:

End 是保留关键字,因此您可以将其转义或在 select 中使用表别名

"select r.routeID, r.routeNo, r.start, r.end from Route r"

【讨论】:

    【解决方案2】:

    End 可能是保留字。

    但是,为什么不直接使用 Hibernate 来获得它的价值,并跳过整个手动行映射的事情:

    TypedQuery q = em.createQuery("select r from Route r", Route.class);
    List<Route> routes = q.getResultList();
    

    使用 em 和类型化查询的示例,因为它给出了更漂亮的结果。会话和演员表也可以做到这一点。

    【讨论】:

    • 非常感谢!我会尝试输入查询! end 是保留字。再次感谢!
    • 你需要使用 entitymanager 而不是 sessionfactory。将您的选择子句更改为select r 可能是最简单的,然后结果将是List&lt;Route&gt;(您需要转换)。
    • 好的。我会试试的。我不知道那个方法。我是休眠新手。再次感谢!
    猜你喜欢
    • 2015-10-18
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多