Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.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 如何修复此数据库查询?_Java_Html_Jsp_Cassandra_Cql - Fatal编程技术网

Java 如何修复此数据库查询?

Java 如何修复此数据库查询?,java,html,jsp,cassandra,cql,Java,Html,Jsp,Cassandra,Cql,上面的代码是我现在正在处理的部分。我终于设法从我的Cassandra数据库中读取了数据,但这只是在我指定了某种条件时,例如“从userprofiles中选择first\u name,其中login='shadowsurge'” 我正在尝试创建一个用户配置文件,显然上面的代码不适合,因为我需要查询来获取与登录用户相关的数据,而不仅仅是获取一个用户的数据,不管登录用户是谁 有人能帮忙吗?基本上,我希望查询获取与当前登录用户关联的名字,但我似乎无法实现这一点。您的查询中的登录名是什么? 您可以尝试将查

上面的代码是我现在正在处理的部分。我终于设法从我的Cassandra数据库中读取了数据,但这只是在我指定了某种条件时,例如
“从userprofiles中选择first\u name,其中login='shadowsurge'”

我正在尝试创建一个用户配置文件,显然上面的代码不适合,因为我需要查询来获取与登录用户相关的数据,而不仅仅是获取一个用户的数据,不管登录用户是谁


有人能帮忙吗?基本上,我希望查询获取与当前登录用户关联的
名字,但我似乎无法实现这一点。

您的查询中的登录名是什么? 您可以尝试将查询更改为:

ResultSet results=sess.execute(“从userprofiles中选择first_name,其中login='+username+')如果登录名与userprofiles表中的用户名相同。

DataStax Cassandra Java驱动程序文档中有一个标题为“您一定要通读”的部分。在本文件中,关于准备好的报表的章节描述了使用这些报表的优点:

使用预先准备好的报表有多种好处。准备好的 语句在Cassandra节点上进行分析和准备,并准备就绪 以备将来执行。绑定参数时,只有这些(和 查询id)通过线路发送。这些性能提升在 重复使用相同的查询(使用不同的参数)

在任何情况下,为了使用Cassandra设置准备好的语句,您都需要稍微修改代码

    // gets user details from jsp form
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    //String forename = request.getParameter("forename");

    // sets new user
    User us = new User();
    us.setCluster( cluster );

    //checks user is valid
    boolean isValid = us.IsValidUser( username, password );
    HttpSession session = request.getSession();
    System.out.println("Session in servlet " + session);

    // sets the user details so it can be displayed during session
    session.setAttribute("userID", username);


    sess = cluster.connect("instagrim");
    ResultSet results = sess.execute ("SELECT first_name FROM userprofiles WHERE login = 'shadowsurge'"  );

    for (Row row : results) 
    {
        String userName = (row.getString("first_name"));
        request.setAttribute("name", userName);
    }

因此,您从未尝试过朴素的版本
“从userprofiles中选择first_name,其中login='“+username+””
?如果这行得通,那就用“”来代替。哇,这太明显了,我为什么不这么做呢。第一次使用Java、JSP、cassandra等。我想我已经考虑过一半了,但非常感谢!我可以问一下,这种方式和事先准备好的声明有什么区别吗?我假设使用预先准备好的语句有某种好处,或者只是养成一个更好的习惯?想想你的问题,如果我注册为
"'; 删除表用户--。一个预先准备好的语句可以避免SQL注入。对,这是一个公平的观点。就像我说的,对这一切都是全新的,不是我这一类的东西。因此,我认为最好不要将其放在JSP文件中,而是放在java类中?@Tom,您提出了一些OP肯定需要听到的好观点。但是CQL!=SQL,所以您提供的链接对与Cassandra合作的人没有多大帮助。很高兴知道这一点!我觉得与CQL相比,网络上有更多关于SQL的信息,或者我只是没有找到正确的地方。但是,是的,非常感谢,我一定会阅读你们提供的链接
sess = cluster.connect("instagrim");

//create a Prepared Statement from your session
PreparedStatement statement = sess.prepare("SELECT first_name FROM userprofiles WHERE login=?");

//create a Bound Statement from your above statement object
BoundStatement boundStatement = new BoundStatement(statement);

//pass your boundStatement to your sess.execute while binding username to it.
ResultSet results = sess.execute(boundStatement.bind(username));