Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
noob,JavaSpring自动连线HibernateMySQL查询,对吗?_Java_Mysql_Hibernate - Fatal编程技术网

noob,JavaSpring自动连线HibernateMySQL查询,对吗?

noob,JavaSpring自动连线HibernateMySQL查询,对吗?,java,mysql,hibernate,Java,Mysql,Hibernate,我正在开发一个小程序,该程序在一个编号列表中列出本地火车站,然后要求用户键入他们希望看到下次到达时间的车站编号 我的问题是,我不认为MySQL查询检索到达时间是正确的。列表返回空。以前使用jdbc时,此查询工作正常: "SELECT arrival_time FROM stop_times WHERE stop_id = '" + myStation.getID() + "' AND arrival_time > time('now', 'localtime') ORDER BY arri

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

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

"SELECT arrival_time FROM stop_times WHERE stop_id = '"
+ myStation.getID()
+ "' AND arrival_time > time('now', 'localtime') ORDER BY arrival_time asc;";
和当前的hibernate查询:

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;

}
公共列表getArrivals(){
sessionFactoryBean.getCurrentSession().beginTransaction();
String sql=“从stop\u times中选择到达时间,其中stop\u id=”
+myStation.getID()
+“'和到达时间>时间('now','localtime')按到达时间asc排序;”;
Query=sessionFactoryBean.getCurrentSession()
.createSQLQuery(sql)
.附录(站级);
List arrivals=query.List();
sessionFactoryBean.getCurrentSession().getTransaction().commit();
返港旅客;
}
从该方法调用,并从中获取IndexOutOfBoundsException:

公共字符串getNextArrival(int用户输入){
getStationName(用户输入);
List arrivals1=arrival.getArrivals();
系统输出打印项次(到达1);
System.out.println(arrivals1.size());
String arrivalTime=arrivals1.get(用户输入);
返回时间(到达时间);
}
线程“main”中出现异常java.lang.IndexOutOfBoundsException:索引:0, 尺寸:0 位于java.util.ArrayList.rangeCheck(ArrayList.java:653) 获取(ArrayList.java:429) 位于com.moeller.code.Stops.getNextArrival(Stops.java:73)

第73行String arrivalTime=arrivals1.get(用户输入);'


数据库存储在本地。

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

当您使用
List.get(param)
param应该是您要查找的位置,而不是用户输入

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


最诚挚的问候

这有几个问题

首先,查询不使用参数,这意味着您可能会在有危险的其他地方犯此错误。您必须传递如下变量:

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

if(arrivals1.size())你在mysql中执行sql了吗?你真的,真的需要学习和使用准备好的语句(或参数化的JPQL查询):。
if (arrivals1.size() <= user_input) {
     return null;
}