複数のテーブルからデータを取得するのが難しい。これは、検索フォームとそのリレーショナルデータベースになります。Java Servletの複数のテーブル(PostgreSQL)からデータを取得するにはどうすればよいですか?
質問1:今、複数のテーブルからデータを取得するにはどうすればよいですか?
質問2:同時に私が直面するもう一つの問題は、名前または姓でしか検索しようとしても結果が得られないということです。私は生年月日を使用した場合にのみ結果を得ます。どうして?
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
java.io.PrintWriter out = response.getWriter();
Connection conn = null;{ // while there is no connections, proceed to the next step
try {
Class.forName("org.postgresql.Driver"); // importing the driver to use the getConnection method
conn = DriverManager.getConnection(
"jdbc:postgresql://localhost:5432/caglar", "postgres", //?searchpath=cag
"abracadabra");
System.out.println("Connected to the database"); // console message
String agent_name = request.getParameter("givenname"); // variable - reads from user input
String agent_lastname = request.getParameter("familyname"); // variable - reads from user input
String dob = request.getParameter("birthyear"); // variable - reads from user input
ArrayList al=null;
ArrayList agent_list =new ArrayList();
//Problem 1: If dob is not given, it is not searching by name or lastname.
//String query = "select * from agent where givenname='"+agent_name+"' or familyname='"+agent_lastname+"' or birthyear='"+dob+"' order by givenname";
String query = "select * from agent where givenname='"+agent_name+"' or familyname='"+agent_lastname+"' ";
if(dob!=null && !"".equals(dob)) // if date of birth fiel is left blank, it will still proceed to the results page
query = query + " or birthyear='"+dob+"'"; // if date of birth exists, it will take it into account as well
query = query+ "order by givenname"; // ordering by first name
System.out.println("query" + query); // console message
Statement st = conn.createStatement(); // connection statement
ResultSet rs = st.executeQuery(query); // executing our query
while(rs.next())
{
al = new ArrayList();
al.add(rs.getString(1));//id
al.add(rs.getString(2));//dob
al.add(rs.getString(3));//name
al.add(rs.getString(4));//lastname
System.out.println("al :: "+al);
agent_list.add(al);
}
request.setAttribute("agentList",agent_list);
Woah、そのコードはSQLインジェクションに対して非常に脆弱です。もしも誰かが:(二重引用符なし) "myname '; DROP TABLE agent; - "の与えられた名前を提出するとどうなるか想像してみてください。少なくともパラメータ化されたクエリを使用する必要があります。 –
直接回答ではありませんが、(a)Facelets/JSF2と(b)JPA2をチェックアウトすることを強くお勧めします。とにかく、あなたが作っているクエリーテキストを、動作中および動作していないテストケースから表示してください。 –
おそらく、DoBが与えられていないと、それは何も一致しません。つまり、givenname/lastname WHERE句は常にfalseと評価されます。なぜデータなしで言うのは難しいのですか?大文字と小文字を区別したり、引用符で囲んだりすることができます。 –