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

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

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

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

Spring

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Spring Boot

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

Q&A

1回答

1844閲覧

CriteriaBuilderのisEmptyメソッドについて

ruuuu

総合スコア168

Java

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

Spring

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Spring Boot

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

0グッド

0クリップ

投稿2020/05/30 05:59

編集2020/05/30 06:01

spring boot2を学習しているのですが、CriteriaBuilderのisEmptyの実装がうまくいきません。
以下はHeloController.javaです。
※文字数制限の為、import文及び、関係ないと思われるリクエストを受け取る一部のメソッドは削除しました。

@Controller public class HeloController { @Autowired MyDataRepository repository; @Autowired MyDataDaoImpl dao; @RequestMapping(value="/find", method = RequestMethod.GET) public ModelAndView find(ModelAndView mav) { mav.setViewName("find"); mav.addObject("title","Find Page"); mav.addObject("msg","MyDataのサンプルです"); mav.addObject("value",""); Iterable<MyData> list = dao.getAll(); mav.addObject("datalist",list); return mav; } @RequestMapping(value = "/find",params = "search",method = RequestMethod.POST) public ModelAndView search(@RequestParam(name="fstr")String param, ModelAndView mav) { mav.setViewName("find"); if(param == "") { mav = new ModelAndView("redirect:/find"); } else { mav.addObject("title","Find result"); mav.addObject("msg","「" + param + "」の検索結果"); mav.addObject("value",param); List<MyData> list = dao.find(param); mav.addObject("datalist",list); } return mav; } @RequestMapping(value = "/find",params = "confirm_data",method = RequestMethod.POST) public ModelAndView empty_check(@RequestParam(name="fstr")String param,ModelAndView mav) { mav.setViewName("find"); mav.addObject("title","Find result"); mav.addObject("msg",""); // mav.addObject("value",); List<MyData> list = dao.not_equal(param); System.out.println(list); mav.addObject("datalist",list); return mav; } @RequestMapping(value = "/find",params = "age_data",method = RequestMethod.POST) public ModelAndView age_greater_than_or_equal_to(@RequestParam(name="age")String param,ModelAndView mav) { mav.setViewName("find"); mav.addObject("title","Find result"); mav.addObject("msg",""); // mav.addObject("value",); List<MyData> list = dao.age_check_1(param); System.out.println(list); mav.addObject("datalist",list); return mav; } @RequestMapping(value = "/find",params = "empty_age_data",method = RequestMethod.POST) public ModelAndView empty_age_data(@RequestParam(name="age")String param,ModelAndView mav) { mav.setViewName("find"); mav.addObject("title","Find result"); mav.addObject("msg",""); // mav.addObject("value",); List<MyData> list = dao.empty_age_check(); System.out.println("ok"); System.exit(0); System.out.println(list); mav.addObject("datalist",list); return mav; } @RequestMapping(value = "/edit/{id}", method = RequestMethod.GET) public ModelAndView edit(@ModelAttribute MyData mydata, @PathVariable int id, ModelAndView mav) { mav.setViewName("edit"); mav.addObject("title", "edit mydata."); Optional<MyData> data = repository.findById((long)id); // Optionalオブジェクトが保持する値を返す(date.get()) mav.addObject("formModel",data.get()); System.out.println("ok"); return mav; } @RequestMapping(value="/edit",method=RequestMethod.POST) @Transactional(readOnly=false) public ModelAndView update(@ModelAttribute MyData mydata,ModelAndView mav){ repository.saveAndFlush(mydata); System.out.println(mydata); return new ModelAndView("redirect:/"); } @PostConstruct public void init() { MyData d1 = new MyData(); d1.setName("tuyano"); d1.setAge(123); d1.setMail("syoda@tuyano.com"); d1.setMemo("a"); repository.saveAndFlush(d1); MyData d2 = new MyData(); d2.setName("hanako"); d2.setAge(15); d2.setMail("hanako@flower"); d2.setMemo("b"); repository.saveAndFlush(d2); MyData d3 = new MyData(); d3.setName("sachiko"); d3.setAge(37); d3.setMail("sachico@happy"); d3.setMemo("c"); repository.saveAndFlush(d3); } } class DataObject{ private int id; private String name; private String value; public DataObject(int id, String name, String value){ super(); this.id = id; this.name = name; this.value = value; } public int getId(){ return id;} public void setId(int id){ this.id = id;} public String getName() { return name;} public void setName(String name){ this.name = name; } public String getValue(){ return value; } public void setValue(String value){ this.value = value; } }

以下は、MyDataDaoImpl.javaです。

@Repository public class MyDataDaoImpl implements MyDataDao<MyData> { private static final long serialVersionUID = 1L; @PersistenceContext private EntityManager entityManager; public MyDataDaoImpl() { super(); } public MyDataDaoImpl(EntityManager manager) { entityManager = manager; } @Override public List<MyData> getAll(){ List<MyData> list = null; CriteriaBuilder builder = entityManager.getCriteriaBuilder(); CriteriaQuery<MyData> query = builder.createQuery(MyData.class); Root<MyData> root = query.from(MyData.class); query.select(root); list = (List<MyData>)entityManager.createQuery(query).getResultList(); return list; } @Override public MyData findById(long id) { return (MyData)entityManager.createQuery("from MyData where id = " + id).getSingleResult(); } @Override public List<MyData> findByName(String name) { return (List<MyData>)entityManager.createQuery("from MyData where nama = " + name).getResultList(); } @Override public List<MyData> find(String fstr) { CriteriaBuilder builder = entityManager.getCriteriaBuilder(); CriteriaQuery<MyData> query = builder.createQuery(MyData.class); Root<MyData> root = query.from(MyData.class); query.select(root).where(builder.equal(root.get("name"),fstr)); List<MyData> list = null; list = (List<MyData>) entityManager.createQuery(query).getResultList(); return list; } @Override public List<MyData> not_equal(String fstr){ CriteriaBuilder builder = entityManager.getCriteriaBuilder(); CriteriaQuery<MyData> query = builder.createQuery(MyData.class); Root<MyData> root = query.from(MyData.class); query.select(root).where(builder.notEqual(root.get("name"),fstr)); List<MyData> list = null; list = (List<MyData>) entityManager.createQuery(query).getResultList(); return list; } @Override public List<MyData> age_check_1(String age) { CriteriaBuilder builder = entityManager.getCriteriaBuilder(); CriteriaQuery<MyData> query = builder.createQuery(MyData.class); Root<MyData> root = query.from(MyData.class); query.select(root).where(builder.greaterThanOrEqualTo(root.get("age"),age)); List<MyData> list = null; list = (List<MyData>) entityManager.createQuery(query).getResultList(); return list; } @Override public List<MyData> empty_age_check() { CriteriaBuilder builder = entityManager.getCriteriaBuilder(); CriteriaQuery<MyData> query = builder.createQuery(MyData.class); Root<MyData> root = query.from(MyData.class); // System.out.println(ToStringBuilder.reflectionToString(root.get("age"))); query.select(root).where(builder.isEmpty(root.get("age"))); System.out.println("ok"); System.exit(0); List<MyData> list = null; list = (List<MyData>) entityManager.createQuery(query).getResultList(); System.out.println(list); System.exit(0); return list; } }

以下は、find.htmlです

<!DOCTYPE html> <html> <head> <title>find page</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <style> h1 { font-size:18pt; font-weight:bold; color:gray; } body { font-size:13pt; color:gray; margin:5px 25px; } tr{ margin:5px; } th{ padding:5px; color:white; background:darkgray; } td{ padding:5px; color:black; background:#e0e0ff; } </style> </head> <body> <h1 th:text="${title}">find page</h1> <p th:text="${msg}"> <table> <form action="/find" method="post"> <tr><td>名前検索:</td> <td><input type="text" name="fstr" size="20" th:value="${value}"></td></tr> <tr><td></td><td><input type="submit" value="指定した名前と等しいデータ" name = "search"><td></td> <tr><td></td><td><input type="submit" name = "confirm_data" value="指定した名前以外のデータ"><td></td> <tr><td>年齢検索</td> <td><input type="text" name="age" size="20" th:value="${value}"></td></tr> <tr><td></td><td><input type="submit" name = "age_data" value="指定した年齢以上のデータ"><td></td> <tr><td></td><td><input type="submit" name = "empty_age_data" value="年齢が空のデータ"><td></td> </form> </table> <hr/> <table> <tr><th>ID</th><th>名前</th><th>メール</th><th>年齢</th></tr> <tr th:each="obj : ${datalist}"> <td th:text="${obj.id}"></td> <td th:text="${obj.name}"></td> <td th:text="${obj.mail}"></td> <td th:text="${obj.age}"></td> </tr> </table> </body> </html>

Eclipseの再生ボタンを押し、http://localhost:8080/findにアクセスすると、以下の画面が表示されます。
イメージ説明
しかし、「年齢が空のデータ」ボタンを押すと、エラーが表示されてしまいます。
イメージ説明
イメージ説明
こちらCaused by: java.lang.IllegalArgumentException: unknown collection expression type [org.hibernate.query.criteria.internal.path.SingularAttributePath]のエラーなどで検索し調べてみたのですが、解決できませんでした。
ご助言頂けましたら幸いです。

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

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

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

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

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

guest

回答1

0

  1. 例外が「IllegalArgumentException 」であること
  2. JavaDoc の説明が以下であること
<C extends java.util.Collection<?>> Predicate isEmpty(Expression<C> collection) コレクションが空かどうかを検証するための述語を作ります。

よって作りが間違えてるんじゃないのかな。
普通に NULL 判定は IS NULL なのでその手のメソッドを使いましょう。

投稿2020/05/30 14:18

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ruuuu

2020/06/03 03:42

ご回答ありがとうございます。 IS NULLで一度試してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問