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

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

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

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

Java

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

2回答

7707閲覧

[Spring JPA]Criteria APIでTimestamp型をlike検索する方法

退会済みユーザー

退会済みユーザー

総合スコア0

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

Java

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2018/07/02 06:58

Criteria Builderを使い下記の要領でDBのレコードをlike検索をしたいです。

ビューからの入力が2018-07-02であればDBから18-07-02に前方一致するレコードを取得。 ・ビューからの入力(String) 2018-07-02 ・ヒットするデータ(Timestamp) 18-07-02 xx:xx:xx.xxxxxxxxx 18-07-02 yy:yy:yy.yyyyyyyyy ・ ・

下記プログラムを組みましたが
実行時にエラーが発生します。
Parameter value
[2018-07-02%] did not match expected type [java.util.Date (n/a)]

試しにエンティティクラスでフィールドの型をDate→Stringに変更してみると
問題なく動作しました。

APIの使い方が間違っているのでしょうか。


リポジトリ

public interface CommandHistoryRepository extends JpaRepository<CommandHistory, Long>, JpaSpecificationExecutor<CommandHistory> { }

サービス

@Service public class CommandHistoryService { @Autowired private CommandHistoryRepository historyRepository; public List<CommandHistory> findBySpecification(SpecificationBuilder builder) { Specifications<CommandHistory> whereClause = builder.build(); return historyRepository.findAll(whereClause, new Sort(Direction.ASC, "id")); }

Specificationビルダー(ここでlike検索をしています)

public class SpecificationBuilder { private Specification<CommandHistory> startDateSpec; /** * @param argStartDate String型の日付(YYYY-MM-dd) * @return フィールドのstartDateSpecにlike検索が設定された自身のオブジェクト */ public SpecificationBuilder startDate(String argStartDate) { startDateSpec = (StringUtils.isEmpty(argStartDate) ? null : (root, query, cb) -> { return cb.like(root.get("startDate"), argStartDate.substring(2) + "%"); }); return this; } public Specifications<CommandHistory> build() { Specifications<CommandHistory> where = Specifications.where(startDateSpec) return where; }

コントローラ

@Autowired private CommandHistoryService commandHistoryService; @RequestMapping(value = "/list/history", params = "search", method = GET) public ModelAndView QueryResult(@RequestParam Map<String, String> param) { //クエリ発行 List<CommandHistory> history = commandHistoryService.findBySpecification (new CommandHistorySpecificationBuilder() //start-dateは必ずYY-MM-ddで入力されます .startDate(param.get("startDate")));

エンティティクラス(一部割愛)

import java.util.Date; @Data @AllArgsConstructor @NoArgsConstructor @Entity @Table(name = "CommandHistory") public class CommandHistory { /** 内部管理用のID */ @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "commandhistory_seq") @SequenceGenerator(name = "commandhistory_seq", sequenceName = "commandhistory_seq", allocationSize = 1) @Column(name = "id") private Long id; @Column(name = "start_date") @Temporal(TemporalType.TIMESTAMP) private Date startDate;

Oracle DB定義

ID      NOT NULL NUMBER(19) ・ ・ START_DATE TIMESTAMP(6)

Stack Overflowでも探してみましたがTimestamp型をlike検索する事例がなかったので
見つけることが出来ませんでした。

ご存知の方、どうぞご教授ください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

Like 検索は普通は文字列に対してしか行いません。
TimeStamp型の表示で 18-07-02 というように表示されていたとしても実際は 2018-07-02 のようにデータを持っているので日付の場合は greaterThanやBetweenを使用して検索させるのが正しいと思います。
どうしてもというのであれば、文字列に一度変換してからLike検索することになります。

文字列が "yyyy/MM/dd HH:mm" の場合の Specification返すソースを以下に記します。

public static Specification<Hoge> startTimeContains(String start) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm"); return StringUtils.isEmpty(start) ? null : (root, query, cb) -> { Timestamp startTime = Timestamp.valueOf(LocalDateTime.parse(start, formatter)); return cb.greaterThanOrEqualTo(root.get("startTime"), startTime); }; }

投稿2018/07/02 07:37

euledge

総合スコア2404

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

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

退会済みユーザー

退会済みユーザー

2018/07/03 06:58

ご回答ありがとうございます。 普段からSQLを作ることがあまりなく、そこに気づくことができませんでした。 日付型の比較において、普通はlikeを使用しないのですね。 勉強になりました。 実装例までありがとうございます。 ご指摘どおり今回はbetweenで実装することで要件を満たすことができました。
guest

0

like検索する方法の回答ではないのですが、提示の件では範囲指定で要件が満たせそうです。

2018-07-02 00:00:00.0
2018-07-03 00:00:00.0

上記の以上+未満での抽出で検索するのはいかがでしょうか?

投稿2018/07/02 07:18

takyafumin

総合スコア2335

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

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

退会済みユーザー

退会済みユーザー

2018/07/03 06:55

ご回答ありがとうございます。 確かに、そうですね。likeを使おうと頭が固くなっていました。 betweenを使い実装することとしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問