Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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
Java SQL结果在Servlet中显示不相同_Java_Sql_Oracle_Web_Servlets - Fatal编程技术网

Java SQL结果在Servlet中显示不相同

Java SQL结果在Servlet中显示不相同,java,sql,oracle,web,servlets,Java,Sql,Oracle,Web,Servlets,全部。 我得到了一个SQL查询,它对query.xml文件中的给定数据进行排序。 当我在SQLD(Oracle)上测试时,它会按预期返回已排序的数据 <entry key="ascUserList"> SELECT CLASS , ID , NAME , USER_NICK , EMAIL , PHONE

全部。

我得到了一个SQL查询,它对query.xml文件中的给定数据进行排序。
当我在SQLD(Oracle)上测试时,它会按预期返回已排序的数据

<entry key="ascUserList">
      SELECT 
            CLASS
           , ID
           , NAME
           , USER_NICK
           , EMAIL
           , PHONE
           , AREA_NAME
           , USER_GRADE
           , USER_POINT
           , GRADE_START
           , GRADE_END
        FROM 
            COM_INFO
        JOIN 
            USER_INFO ON (ID = USER_ID)
        JOIN 
            AREA USING(USER_AREA)
       WHERE 
             CLASS LIKE '%' || '일반' || '%'
         AND  USER_SIGNUP LIKE '%' || 'Y' || '%'
     ORDER BY  ? ASC
   </entry>

挑选
阶级
身份证件
名称
,USER_NICK
,电邮
,电话
,地区名称
,用户等级
,用户点
,二年级开始
,二级
从…起
COM_信息
参加
用户信息(ID=用户ID)
参加
区域使用(用户\区域)
哪里
类“%”| |”일반' || '%'
和用户注册,如“%”| |“Y”| |“%”
点菜吗?ASC

然后这个Servlet从上述代码中获取排序后的数据。
我希望在ArrayList中添加已排序的数据,但是,返回的结果是未排序的数据

public ArrayList<UserInfo> ascUserList(Connection conn, String sort) {
      ArrayList<UserInfo> list = new ArrayList<>();
      PreparedStatement pstmt = null;
      ResultSet rset = null;
      String sql = prop.getProperty("ascUserList");
      System.out.println(sort.equals("이름"));
      try {
         pstmt = conn.prepareStatement(sql);
         
         switch(sort) {
         case "정렬기준": pstmt.setString(1, "ID"); break;
         case "아이디": pstmt.setString(1, "ID"); break;
         case "이름": pstmt.setString(1, "NAME"); break;
         case "닉네임": pstmt.setString(1, "USER_NICK"); break;
         case "지역": pstmt.setString(1, "AREA_NAME"); break;
         case "등급": pstmt.setString(1, "USER_GRADE"); break;
         }
         
         rset = pstmt.executeQuery();

         while(rset.next()) {
            list.add(new UserInfo(rset.getString(2),
                    rset.getString(1),
                    rset.getString(5),
                    rset.getString(3),
                    rset.getString(6),
                    rset.getString(4),
                    rset.getString(7),
                    rset.getString(8),
                    rset.getDate(10),
                    rset.getDate(11),
                    Integer.parseInt(rset.getString(9))));
            System.out.println(list);
         }
         
      } catch (SQLException e) {
         e.printStackTrace();
      } finally {
         close(rset);
         close(pstmt);
      }
      
      return list;
   }
public ArrayList ascUserList(连接连接,字符串排序){
ArrayList=新建ArrayList();
PreparedStatement pstmt=null;
ResultSet-rset=null;
字符串sql=prop.getProperty(“ascUserList”);
System.out.println(sort.equals(“이름"));
试一试{
pstmt=conn.prepareStatement(sql);
开关(分拣){
案例”정렬기준“:pstmt.setString(1,“ID”);中断;
案例”아이디“:pstmt.setString(1,“ID”);中断;
案例”이름“:pstmt.setString(1,“名称”);中断;
案例”닉네임“:pstmt.setString(1,“用户缺口”);中断;
案例”지역“:pstmt.设置字符串(1,“区域名称”);中断;
案例”등급:pstmt.setString(1,“用户等级”);中断;
}
rset=pstmt.executeQuery();
while(rset.next()){
添加新的用户信息(rset.getString(2),
rset.getString(1),
rset.getString(5),
rset.getString(3),
rset.getString(6),
rset.getString(4),
rset.getString(7),
rset.getString(8),
注册日期(10),
注册日期(11),
Integer.parseInt(rset.getString(9));
系统输出打印项次(列表);
}
}捕获(SQLE异常){
e、 printStackTrace();
}最后{
关闭(rset);
关闭(pstmt);
}
退货清单;
}

非常感谢您的建议!

这是因为
指定了一个占位符值,所以您总是按常量排序

Oracle区分常量int(通过
传递)和列的整数位置,当您执行
选择*from…order by 1
时,列的整数位置将被放置。对于后者,1是语法的一部分,其作用类似于标识符。您可以使用下面的代码对此进行检查

如您所见,第一个查询将1视为列位置并按第一列排序,而第二个查询实际按第二列排序

或者更灵活的方式-在应用程序端编写动态SQL查询并将其传递给数据库。但是要注意SQL注入,使用元数据按照应用程序代码排序,而不是从某些用户输入(如输入字段)。或者根据DBMS字典检查输入,例如:

with a as (
  select
    'A' as COL1_VARCHAR,
    'B' as COL2_VARCHAR,
    sysdate as COL3_DATE,
    sysdate as COL4_DATE,
    1 as COL5_NUMBER,
    2 as COL6_NUMBER,
    3 as COL7_NUMBER
  from dual
)
select *
from a
order by
  /*varchar*/
  decode(?,
    1, COL1_VARCHAR,
    2, COL2_VARCHAR
  ) asc,
  /*date*/
  decode(?,
    3, COL3_DATE,
    4, COL4_DATE
  ) asc,
  /*number*/
  decode(?,
    5, COL5_NUMBER,
    6, COL6_NUMBER,
    7, COL7_NUMBER
  ) asc
select count(1)
from all_tab_cols
where table_name = 'YOUR_TABLE_NAME_IN_FROM'
  and column_name = ? --user input with column name

指定一个占位符值,因此您总是按常量排序。如果我不能排除
占位符怎么办?用户输入是排序的标准,因此我需要将排序标准设置为占位符。静态SQL无法做到这一点,只有动态SQL才能做到。或者可能是一些使静态SQL像动态SQL一样工作的复杂代码。这是一个这是一个很好的例子,说明了SQL@100我已经更新了答案谢谢你的解释!我想我需要更多的实践SQL的概念。再次感谢你!:)
with a as (
  select 1 as s1, 10 as s2 from dual union all
  select 3, 20 from dual union all
  select 2, 30 from dual
)
select *
from a
order by cast('1' as number), 2
S1 | S2 -: | -: 1 | 10 3 | 20 2 | 30
with a as (
  select
    'A' as COL1_VARCHAR,
    'B' as COL2_VARCHAR,
    sysdate as COL3_DATE,
    sysdate as COL4_DATE,
    1 as COL5_NUMBER,
    2 as COL6_NUMBER,
    3 as COL7_NUMBER
  from dual
)
select *
from a
order by
  /*varchar*/
  decode(?,
    1, COL1_VARCHAR,
    2, COL2_VARCHAR
  ) asc,
  /*date*/
  decode(?,
    3, COL3_DATE,
    4, COL4_DATE
  ) asc,
  /*number*/
  decode(?,
    5, COL5_NUMBER,
    6, COL6_NUMBER,
    7, COL7_NUMBER
  ) asc
select count(1)
from all_tab_cols
where table_name = 'YOUR_TABLE_NAME_IN_FROM'
  and column_name = ? --user input with column name