質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Struts 2

Apache Struts 2は、Apache Strutsプロジェクトにて開発されているオープンソースのJavaベースのWebアプリケーションフレームワークです。Sturts1に比べ、設定ファイルの削減、依存性の注入、POJO等の改善がなされています。

Q&A

3回答

1747閲覧

javaを使用し、検索機能を追加したいです。コードについてアドバイスをください。

Takki

総合スコア16

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Struts 2

Apache Struts 2は、Apache Strutsプロジェクトにて開発されているオープンソースのJavaベースのWebアプリケーションフレームワークです。Sturts1に比べ、設定ファイルの削減、依存性の注入、POJO等の改善がなされています。

0グッド

0クリップ

投稿2018/10/22 07:49

前提・実現したいこと

Javaとstruts2を使い、趣味でアプリケーションを製作しております。
現在、キーワードやカテゴリーで絞り込める検索機能を追加しようと思っているのですが、
コードを考えたところ、冗長的なものとなってしまいました。
もっと簡潔にするためにはどうすればいいかアドバイスをいただけないでしょうか。

【画面仕様】
キーワード入力欄(以降A)が1つ、カテゴリーを絞る2つのセレクトボックス(以降B,C)があります。
キーワードもカテゴリーも文字列で受け取ります。(空文字列で初期化してあります)
DBに接続するメソッドはA,B,Cを引数に実行されます。
検索パターンは【A】【B】【C】【A,B】【A,C】【A,B,C】【B,C】の7通りで、
条件によってSQLを変更しております。

※コードというよりももっと根本的な見直しが必要なのかもしれませんが、今回は上記の条件でお願いします。
※setter,getterは省略しています。

該当のソースコード

public class SearchAction extends ActionSupport{
private String A = "";
private String B = "";
private String C = "";

public String execute(){ if(B.isEmpty() && C.isEmpty()){ //Aのみで検索 return SUCCESS; } if(A.isEmpty() && C.isEmpty()){ //Bのみで検索 return SUCCESS; } if(A.isEmpty() && B.isEmpty()){ //Cのみで検索 return SUCCESS; } if(C.isEmpty()){ //ABのみで検索 return SUCCESS; } if(B.isEmpty()){ //ACのみで検索 return SUCCESS; } if(A.isEmpty()){ //BCのみで検索 return SUCCESS; } if(!(A.isEmpty() && B.isEmpty() && C.isEmpty())){ //ABCで検索 return SUCCESS; } return SUCCESS; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

元となるSQLが書かれていないので、WHERE句の動的生成で行うときの問題と勝手に認識して回答します。

SQLの条件が全部ANDであれば簡単ですが、文中から察するに、BとCの条件は、B または Cなのでしょう。

となると割とメンドクサイんですが、WHERE句の先頭を 1=1 にするとこで常にANDで接続させる。
カテゴリ条件については 要素がORでつなぐので別の検索条件を作らないとならない。

それらの結果から、SQLを生成するコードは以下のようになるでしょうか。

java

1import java.util.StringJoiner; 2 3public class SQLJoiner { 4 public String joiner(String a, String b, String c) { 5 String sql = "SELECT ID, NAME FROM SAMPLE_TABLE " 6 + "WHERE 1=1"; 7 8 String patternA = "AND NAME = '" + a + "'"; 9 String patternB = "AND CATEGORY IN ("; 10 String patternC = ")"; 11 12 if ( a != null ) { 13 sql = String.join(" ", sql, patternA); 14 } 15 16 if ( b != null || c != null) { 17 sql = String.join(" ", sql, patternB); 18 19 StringJoiner joiner = new StringJoiner(","); 20 if ( b != null) { 21 joiner.add("'" + b + "'"); 22 } 23 if ( c != null) { 24 joiner.add("'" + c + "'"); 25 } 26 27 sql = String.join("", sql, joiner.toString(), patternC); 28 } 29 30 return sql; 31 } 32}

テストケース(grrovy+spock)

import spock.lang.Specification /** * @author a-pz * */ class SQLJoinerTest extends Specification { SQLJoiner sut = new SQLJoiner() def "SQL結合"() { expect: sut.joiner(a, b, c) == $expect where: a | b | c | $expect null | null | null | "SELECT ID, NAME FROM SAMPLE_TABLE WHERE 1=1" 'なまえ' | null | null | "SELECT ID, NAME FROM SAMPLE_TABLE WHERE 1=1 AND NAME = 'なまえ'" 'なまえ' | 'ジャンルA' | null | "SELECT ID, NAME FROM SAMPLE_TABLE WHERE 1=1 AND NAME = 'なまえ' AND CATEGORY IN ('ジャンルA')" 'なまえ' | 'ジャンルA' | 'ジャンルB' | "SELECT ID, NAME FROM SAMPLE_TABLE WHERE 1=1 AND NAME = 'なまえ' AND CATEGORY IN ('ジャンルA','ジャンルB')" 'なまえ' | null | 'ジャンルB' | "SELECT ID, NAME FROM SAMPLE_TABLE WHERE 1=1 AND NAME = 'なまえ' AND CATEGORY IN ('ジャンルB')" null | 'ジャンルA' | 'ジャンルB' | "SELECT ID, NAME FROM SAMPLE_TABLE WHERE 1=1 AND CATEGORY IN ('ジャンルA','ジャンルB')" } }

投稿2018/10/23 15:45

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

java8のOptionalの複数オブジェクトの判定方法

これは参考になりますでしょうか。

投稿2018/10/22 07:59

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

うーん、SQLを構築する部分で、Aがあればその条件をSQLに足しこむ、Bがあれば、…といった感じでしょうか。
R/Oマッパーでも似たようにできるかと。

投稿2018/10/22 07:58

編集2018/10/22 08:00
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問