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

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

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

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

SQL

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Spring Boot

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

Q&A

1回答

4532閲覧

【SpringBoot】サービスクラスを用いた、生年月日から年齢の算出

150be

総合スコア20

Java

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

SQL

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Spring Boot

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

0グッド

1クリップ

投稿2019/02/26 13:01

編集2019/02/26 13:03

前提・実現したいこと

【実現したいこと】
テーブルに格納されている個人の生年月日から、Calculationクラスで年齢を算出し、表示する。

【現状】
テーブルには、氏名と生年月日(yyyymmdd)がある。

【理想手順】
①フォームに年齢の下限と上限を入力。
②入力された値を引数に検索をかけるため、取得する。
③テーブルに格納されている生徒の生年月日を基に、生徒1人1人の年齢を算出(Calculationクラスを利用)
④②で取得した値を引数に、生徒の年齢がその下限値と上限値の間かどうか検索をかける。
⑤検索にかかった、全生徒の氏名と年齢を表示。

発生している問題

・年齢を新しく持ったListを作ろうとしている。
しかし、他のサイトを参考にしてみても上手く作れていない。
そもそも、一人ずつの年齢の算出方法でつまずいている。

該当のソースコード

Controller

1package com.tuyano.springboot; 2 3@Controller 4public class AgeController { 5 6 @Autowired 7 private AgeService service; 8 9 @PersistenceContext 10 EntityManager entityManager; 11 12// ダミーデータの作成 13 @PostConstruct 14 public void init() { 15 Age A1 = new Age(); 16 E1.setStudentName("鈴木"); 17 E1.setBirthYMD(20070802); 18 Age A2 = new Age(); 19 E2.setStudentName("佐藤"); 20 E2.setBirthYMD(20080506); 21 Age A3 = new Age(); 22 E3.setStudentName("青木"); 23 E3.setBirthYMD(20071109); 24 } 25 26 @RequestMapping(value = "/search", method = RequestMethod.GET) 27 public ModelAndView age(ModelAndView mav) { 28 mav.setViewName("search"); 29 mav.addObject("msg", "生徒検索画面です!"); 30 mav.addObject("value", ""); 31 return mav; 32 } 33 34 @RequestMapping(value = "/search", method = RequestMethod.POST) 35// 検索機能 36 public ModelAndView search(HttpServletRequest request, 37 ModelAndView mav) { 38 mav.setViewName("search"); 39 mav.addObject("msg", "検索結果です!"); 40 41// 年齢下限・上限の引数を取得 42 int downageparam = Integer.parseInt(request.getParameter("downage")); 43 int upageparam = Integer.parseInt(request.getParameter("upage")); 44 45// 入力値を引数にDBへ検索をかける 46 List<Age> list = service.find(downageparam, upageparam ); 47 mav.addObject("datalist", list); 48 49 return mav; 50 51}

AgeService

1package com.tuyano.springboot; 2 3@Service 4public class AgeService { 5 6 @PersistenceContext 7 private EntityManager entityManager; 8 9 @SuppressWarnings("unchecked") 10 public List<Age>find(int downage, int upage) { 11 List<Age> list = null; 12 String qstr = "from Age where " 13 + " age >= :downageparam and age <= :upageparam "; 14 Query queryName = entityManager.createQuery(qstr) 15 .setParameter("downageParam", downage) 16 .setParameter("upagePara,", upage); 17 list = queryName.getResultList(); 18 return list; 19 } 20 21}

HTML

1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org"> 3<head> 4 <title>top page</title> 5 <meta http-equiv="Content-Type" 6 content="text/html; charset=UTF-8" /> 7</head> 8<body> 9 <h1 th:text="#{content.title}">Student Search</h1> 10 <p th:text="${msg}">生徒検索画面です。</p> 11 <table> 12 <form action="/search" method="post" > 13 <tr><td><label for="age">年齢</label></td> 14      <td> 15    <input type="text" name="downage" size="2" /> 16      </td> 17      <td>~</td> 18      <td> 19       <input type="text" name="upage" size="2" />歳 20   </td></tr> 21 <td> 22 <input type="submit" name="kensaku" value="検索" /> 23 </td> 24 </tr> 25 </form> 26 </table> 27 <table> 28 <tr><th>生徒名</th><th>年齢</th></tr> 29 <tr th:each="obj : ${datalist}"> 30 <td th:text="${obj.StudentName}"></td> 31 <td th:text="${obj.old}"></td> 32 </tr> 33 <tr> 34 <td> 35 <input type="submit" name="return" value="戻る" /> 36 </td> 37 </tr> 38 </table> 39</body> 40</html>

Calculation

1package tuyano.calculation; 2 3@Service 4public class Calculation{ 5 6// 現在の年度を算出 7  int nendo = LocalDate.now().minusMonths(3).getYear(); 8 9// 年度計算を実施し、年齢をリターン  10  public int getAge(int birthYMD) { 11    int age = 0; 12    age = nendo - birthYMD; 13    return age; 14  } 15 16}

試したこと

・年齢を配列で取得しようとした
→List内のデータと一致させられずに、表示まで出来なかった。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/02/27 00:05

とりあえず コンパイルエラーになる情報の提供はやめよう どこの提供のjpaかは明記しよう。(hibernate以外も選択できます) 計算してる桁数を把握しよう(4桁と8桁等)
guest

回答1

0

テーブルには、氏名と生年月日(yyyymmdd)がある。

生年月日がDATE型として、Oracleでは生年月日から年齢を取得 FUNCTION を用意して、

SQL

1SELECT 氏名, GET_AGE(生年月日) AS AGE FROM テーブル名 ;

で年齢を取得します。

同じSQLでもデータベースによって方言が大きいですから、どのデータベースを使うのかを質問のタグで明示したり、バージョンも明記した方が適切なコメントが付き易いです。 SQLの観点から Oracle Database, PostgreSQL, MySQL の特徴を整理しよう!

投稿2019/02/26 19:55

Orlofsky

総合スコア16415

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

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

wwbQzhMkhhgEmhU

2019/02/26 20:09

少し回答から遠すぎる気がします。 Ageクラスもなく、JPQLの変更方法もなく、SQLだけ書かれても対応が難しいと思います。 また、恐らくこの方が必要としている情報は年齢というよりも学年だと思います。 余計な真似かもしれませんが、ご再考して頂けると幸いです。
Orlofsky

2019/02/26 22:35

CREATE VIEW VIEW_NAME1 AS で上記の SELECT を記述することで、VIEW_NAME1 というテーブルのようなものに年齢カラムがあるように扱えます。 >年齢がその下限値と上限値 の範囲のデータだけ抽出することもできますから的外れではありません。 通常、データベースサーバーにはそれなりにお金をかけた高性能なハードウェアを用意します。DBの中で加工できるものはDBの中でやってしまった方がパフォーマンスが良いことが多いです。
wwbQzhMkhhgEmhU

2019/02/26 22:55

パフォーマンスのことは相応のデータがある想定が出来てからで十分です。 まずは質問者が出来ることを組み合わせて可能な想定のものを提示した方がいいかと思います。 DB=永続化という観点でJPA使ってる時点で、アプリ側で出来ることはしちゃう質問者の選択は間違っていないかと思います。わざわざOracle固有の関数を使う意味が分かりません。 学年については勘です。年齢による出力をしている点で年齢でいいのかなとも思うのですが、年度による計算を試行している点や、範囲による絞り込みをしている点から、学年なのかなぁと朧げに思ったまでの話なので。ただ、こういうのこそ本人に確認すべきではないかと愚行します。
退会済みユーザー

退会済みユーザー

2019/02/26 22:57

クエリ(JPQL)が難しいならネイティブクエリ(SQL)でかけばいいじゃない DBを選択できるオープンソースの作成をするならともかく
wwbQzhMkhhgEmhU

2019/02/26 23:06

Entityに年齢入れるの?永続化に使うのに?必要もないのに?
退会済みユーザー

退会済みユーザー

2019/02/26 23:54

persistence にはテーブルに存在(保存)しない項目を扱う方法が存在するし、 nativeQuery ならば条件式に限って言えばエンティティに存在してるかは関係ない。
150be

2019/02/27 00:11

>Orlofskyさん  丁寧なご返答ありがとうございます。 Selectで必要な値を抜き取って、そのデータをビューとして扱うと言いう事ですね! 非常に理解できます。Create ViewがSpringで実装出来るのかという所から、一旦調査していきます。
wwbQzhMkhhgEmhU

2019/02/27 00:27

本人が理解できるのならいいでしょう。 WHERE句以外で年齢は必要そうですし、保存しない方法があるのと、それをいきなり使えるようになるのは別の問題だとは思うけど、この辺で失礼しときます。 基本ビューはその名の通り、見るためのモノですし、クエリごとにポンポン作成するような代物でもないことだけ、言っておきます。それでは頑張ってくださいね。
Orlofsky

2019/02/28 13:02

wwbQzhMkhhgEmhU さん、 最良の解決方法があるなら、きちんと「回答」に載せては?
wwbQzhMkhhgEmhU

2019/02/28 17:28

いや、質問者さんが困るかなと思っただけで、困らないならどちらがいいという話でもないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問