【问题标题】:noob, java spring autowired hibernate mysql query, is this right?菜鸟,java spring autowired hibernate mysql 查询,对吗?
【发布时间】:2018-01-24 18:55:41
【问题描述】:

我正在开发一个小程序,该程序在编号列表中列出当地火车站,然后要求用户输入他们希望查看下一次到达时间的车站号码。

我的问题是我不认为 MySQL 查询是正确的检索到达时间。该列表返回空。以前使用 jdbc,此查询运行良好:

"SELECT arrival_time FROM stop_times WHERE stop_id = '"
+ myStation.getID()
+ "' AND arrival_time > time('now', 'localtime') ORDER BY arrival_time asc;";

以及当前的休眠查询:

public List<String> getArrivals() {
    sessionFactoryBean.getCurrentSession().beginTransaction();

    String sql = "SELECT arrival_time FROM stop_times WHERE stop_id = '"
       + myStation.getID()
       + "' AND arrival_time > time('now', 'localtime') ORDER BY arrival_time asc;";

    Query query = sessionFactoryBean.getCurrentSession()
       .createSQLQuery(sql)
       .addEntity(Station.class);

    List<String> arrivals = query.list();

    sessionFactoryBean.getCurrentSession().getTransaction().commit();
    return arrivals;

}

从这个方法调用,我在哪里得到 IndexOutOfBoundsException

public String getNextArrival(int user_input) {

    getStationName(user_input);


    List<String> arrivals1 = arrival.getArrivals();

    System.out.println(arrivals1);
    System.out.println(arrivals1.size());

    String arrivalTime = arrivals1.get(user_input);
    return convertTime(arrivalTime);
}

线程“main”中的异常java.lang.IndexOutOfBoundsException:索引:0, 尺寸:0 在 java.util.ArrayList.rangeCheck(ArrayList.java:653) 在 java.util.ArrayList.get(ArrayList.java:429) 在 com.moeller.code.Stops.getNextArrival(Stops.java:73)

第73行字符串到达​​时间=到达1.get(user_input);'

数据库存储在本地。

【问题讨论】:

  • 你在mysql中执行了sql吗?
  • 你真的,真的需要学习和使用准备好的语句(或参数化的 JPQL 查询):docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html
  • 还有stop_times的表结构是什么?
  • 我在 sqlite 中执行了它,它确实有效。不知道hibernate是不是因为某种原因不喜欢,第一次用。

标签: java mysql hibernate


【解决方案1】:

这有几个问题。

首先,查询不使用参数,这意味着您可能会在其他地方犯这个错误,这将是一个危险。你必须像这样传递变量:

String sql = "SELECT arrival_time FROM stop_times WHERE stop_id = ?"
   + " AND arrival_time > time('now', 'localtime') ORDER BY arrival_time asc;";

Query query = sessionFactoryBean.getCurrentSession()
   .createSQLQuery(sql)
   .addEntity(Station.class);

query.setParameter(1, myStation.getID());

看到问号了吗?那是一个位置参数。您也可以使用命名参数。

String sql = "SELECT thing FROM table WHERE column1 LIKE :ptrn";
...
query.setParameter("ptrn", "%that%");

注意查询中参数如何以: 开头,但在调用setParameter 时却不是。

这种安全插入参数的方法称为使用“准备语句”或“参数化查询”。找一个关于它们的快速教程,它们非常重要。

其次,在getNextArrival 中,您忘记检查列表是否包含那么多元素。

if (arrivals1.size() <= user_input) {
     return null;
}

当然,当它向使用它的函数返回 null 时,你必须小心。

【讨论】:

    【解决方案2】:

    您对列表使用了错误的方法。

    当你使用List.get(param) 参数时应该是你正在寻找的位置,而不是用户输入。

    您需要循环列表并将列表的每个位置与用户输入进行比较。

    最好的问候

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2011-02-18
      • 2018-11-30
      • 2012-03-30
      • 1970-01-01
      • 2015-07-20
      • 2023-04-10
      相关资源
      最近更新 更多