起点:我正在JSP / EJB(Java EE 8)中构建一个页面,该页面显示2个表:1用于数据库中注册的每个用户的名称和分数,另一个用于显示针对剪刀石头布的所有未决挑战。当前登录的用户。

数据库:到目前为止,我有2个表可以通过“ LOCALHOST”进行访问。前缀:Usercredentials和Pending_Challenges。两者都是使用以下代码创建的:

数据库:JavaDB

用户凭证:

CREATE TABLE USERCREDENTIALS (

    username varchar(10) primary key,
    password varchar(10) not null

);


是的,是的,我知道这些不是最好的领域,但我要怪我的队友! :)

待处理的挑战:

CREATE TABLE PENDING_CHALLENGES (

    challenge_id integer primary key,
    from_user varchar(10) references Usercredentials(username),
    to_user varchar(10) references Usercredentials(username),

);


到目前为止,这些表包含以下数据:

Username | Password | Score
---------------------------
tom      | tom      | 5
mo       | mo       | 2
jon      | jon      | 0

Challenge_ID | From_User | To_User
----------------------------------
1            | tom       | mo
2            | jon       | tom


我在名为ListUserServlet.java的文件中调用这些表,在其中运行2个查询。每一个都将创建一组不同的结果(ofc下面的代码),以将其打印在2个不同的表中。

{... working Java code...}

    System.out.println("Creating EMF query for userList");
    String query = "SELECT U FROM Usercredentials U ORDER BY U.score DESC";
    List users = em.createQuery(query).getResultList();
    request.setAttribute("userList", users");

{... working Java code...}


在显示表的我的.jsp文件中,我得到以下内容(不管ID标记,我们正在对其进行更改):

<h3>Current rankings:</h3>

    <form id="challengeUserForm" action="ChallengeUser" method="POST">
    <table id="userListTable" border="3">
        <tr >
            <th>Username</th>
            <th>Challenge others</th>
            <th>Score</th>
        </tr>
        <c:forEach var="user" begin="0" items="${requestScope.userList}">
            <tr>
                <td>${user.username}&nbsp;&nbsp;</td>
                <td><input type="submit" id="${user.username}" value="Challenge!"></td>
                <td>${user.score}</td>
            </tr>
        </c:forEach>
    </table>


使用这种方法,我还通过使用以下方法打印了该表中当前持有的所有挑战:

{... working Java code...}

    query = "SELECT P FROM PendingChallenges P";
    List chall = em.createQuery(query).getResultList();
    request.setAttribute("pendingList", chall);

{... working Java code...}


现在,使用相同的逻辑,这就是我打印表格的方式:

<h3>Pending challenges:</h3>

<form id="acceptChallengeForm" action="AcceptChallenge" method="POST">
    <table id="pendingTable" border="3">
        <tr>
            <th>Username</th>
            <th>Accept challenge</th>
        </tr>
        <c:forEach var="pending" begin="0" items="${requestScope.pendingList}">
            <tr>
                <td>${pending.fromUser.username} &nbsp;&nbsp;</td>
                <td><input type="submit" id="${pending.fromUser.username} " value="Accept!"></td>
            </tr>
        </c:forEach>
    </table>
</form>


我需要从不是当前登录用户的“ from_user”列中获取每一行(会话变量已就位)。我的简单想法是在Pending查询中包含“ NOT LIKE”语句:

query = "SELECT P.fromUser FROM PendingChallenges P WHERE P.fromUser NOT LIKE '" + current_user + "'";


“ current_user”是我提到的EJB会话字符串。

但是,每次运行它时,我都会收到错误消息,指出“ P.fromUser”不是字符串,“ P.fromUser.username”不属于“ entity [Usercredentials]”之类,或者不是关键字“ LIKE” ”-> SQLException错误代码30000。

最佳答案

我会读到“ SQL连接”。

查询应该是这样的,以便从用户凭证表中获取字段:

SELECT * FROM PendingChallenges P
   INNER JOIN UserCredentials U ON P.fromUser = U.username
   WHERE P.fromUser != '" + current_user + "'"

07-24 09:49
查看更多