开始:我在JSP / EJB(Java EE 8)中构建一个显示2个表的页面:1用于在数据库中注册的每个用户的名称和分数,另一个用于显示所有用户当前登录用户的摇滚纸 - scisors的未决挑战。
数据库:到目前为止,我有2个表可以通过" LOCALHOST进行访问。" prefix:Usercredentials和Pending_Challenges。两者都是使用以下代码创建的:
数据库:JavaDB
Usercredentials:
CREATE TABLE USERCREDENTIALS (
username varchar(10) primary key,
password varchar(10) not null
);
是的,是的,我知道这些不是最好的领域,但我责备我的队友! :)
Pending_Challenges:
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个查询。每一个都要创建一组不同的结果(下面的代码为c),以便在两个不同的表格中打印。
{... 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} </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} </td>
<td><input type="submit" id="${pending.fromUser.username} " value="Accept!"></td>
</tr>
</c:forEach>
</table>
</form>
我需要从列#34; from_user&#34;中获取每一行。这不是当前登录的用户(会话变量已经到位)。我的简单想法是包括一个&#34; NOT LIKE&#34;待处理查询中的语句:
query = "SELECT P.fromUser FROM PendingChallenges P WHERE P.fromUser NOT LIKE '" + current_user + "'";
&#34; CURRENT_USER&#34;是我提到的EJB会话字符串。
然而,每次我运行它时,我都会得到错误,说是&#34; P.fromUser&#34;不是字符串,&#34; P.fromUser.username&#34;不属于&#34;实体[Usercredentials]&#34;或类似或关键字&#34; LIKE&#34;尚未被认可 - &gt;类似于SQLException错误代码30000。
答案 0 :(得分:0)
我会读到&#34; SQL加入&#34;。
查询应该是这样的,以从用户凭证表中获取字段:
SELECT * FROM PendingChallenges P
INNER JOIN UserCredentials U ON P.fromUser = U.username
WHERE P.fromUser != '" + current_user + "'"