noob,JavaSpring自动连线HibernateMySQL查询,对吗?
我正在开发一个小程序,该程序在一个编号列表中列出本地火车站,然后要求用户键入他们希望看到下次到达时间的车站编号 我的问题是,我不认为MySQL查询检索到达时间是正确的。列表返回空。以前使用jdbc时,此查询工作正常: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
"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;
}