Challenge Engineer Life !

エンジニア人生を楽しみたい!仕事や趣味で学んだ技術的なことを書いていくブログです。

どこでもKotlin #3でKotlin x SendGridのLTしました~ #m3kt

前回初参加した「どこでもKotlin #2」が楽しかったので#3も参加させていただきました!しかもLT発表枠で参加!

m3-engineer.connpass.com

#2の様子は主催のM3さんが書かれてるTech Blogレポートをどうぞ。

www.m3tech.blog

LT申し込みの動機

少し前にちょうどSendGridをKotlinから使うネタを会社ブログで書きまして

sendgrid.kke.co.jp

せっかくなので話をしたいなーと。Kotlin盛り上がってますし、サーバサイドKotlinだとAPIによるメール送信の需要もあるかなーと。

LTスライドはこちらです。

一番ウケたのが自己紹介の堀北真希さんファンクラブ(元)会員番号11という部分でした(^^;;;後半で笑いどころを設けるべきだった…とちょっと反省。

メール送信ってわりと地味なのでLT発表は中々難しい(^^;もっと技術面でインパクト出したいところですが、今回は真面目にKotlinからの使い方について話しました。

Kotlin Webアプリケーション

前回の「どこでもKotlin #2」はアンケート回答による(だったかな確か…)書籍プレゼントの抽選がありました。

Kotlin Webアプリケーションこと、通称「黒ベコ本」!

で、こちらの抽選になんと!当たってしまいました(>_<)!ちょうど自分で買おうとしてた所だったのでメッチャ嬉しい!

f:id:kikutaro777:20171023233019j:plain

著者のたろーさんにサインいただきました!わーい!

f:id:kikutaro777:20171023233041j:plain

他の方のLT

LT、どれも面白くて、幅も広かったです。

最初のLTネタだったDeeplearning4jは今回LTを聞いて初めて知りました。

deeplearning4j.org

Skymind社さんが提供してるとのことですが、なんと!イベントにSkymind社CTOの方がいらっしゃってました。
オライリーから出した書籍プレゼントのじゃんけん大会が急遽開かれましたw

skymind.ai

私の前に発表された方は自己紹介をKotlinで書かれててシビれた!!Speaker.ktってw

Android Things知らなったです。あとGCPのCloud Functionsがあることも知らなかったなぁ。。。

あとQuery DSLの話もあって、まさかKotlin勉強会で聞くとは!

サイバーエージェントさんのJavaからKotlin導入話も面白かったです。Scala、Go、Kotlinの選択肢から実際に勉強会で皆で簡単なWebシステム作って比較ってのいいですね。以下表は後付けらしいですがw

以下のブログとも関連あり。

developers.cyberagent.co.jp

LTで最後に「導入がゴールではない」とおっしゃられてて刺さりました。

次回もLT大会らしいので楽しみです(^^)

Querydslを触ってみる

今のJava EE開発では、JPQLを書く際

  • 動的クエリ(Dynamic Query)
  • 名前付きクエリ(Named Query)

を使うようにしていて、本来、型のことなど考えるとCriteriaで書くべきだなんだろうな…と思いつつ、可読性や簡易性を優先して上記選択にしています。

ただ、どうしても動的クエリはStringBuilderなどでクエリをダラダラと連結することになって、わりとイケてないらしい…ですね。

ということで、前に@megascusさんがブログで紹介されていたQuerydslを思い出し、これから少し触っていこうかなと。

QuerydslでJPAが思ったよりも捗る

上記ブログ記事の中にあるサンプルコードや、公式サイトのチュートリアルに接頭辞「Q」が付いたEntityクラスみたいなものが出てくるので、なんなんだろあれ?と思ってたのですが、定義したEntityクラスをベースにQuerydslが(というか実際にはapt(Annotation Processing Tool))が自動生成するクラスなんですね。

ってかapt初めて知りました(^^;
ググるとき気を付けないとLinuxのaptが出てきそう…(^^;

……

そんなこんな調べつつ、QuerydlsのドキュメントからQuerying JPAのチュートリアルを参考に触ってみました。

Mavenによる依存性定義

pom.xmlは以下としました。

<dependency>
    <groupId>com.mysema.querydsl</groupId>
    <artifactId>querydsl-apt</artifactId>
    <version>3.3.2</version>
</dependency>
<dependency>
    <groupId>com.mysema.querydsl</groupId>
    <artifactId>querydsl-jpa</artifactId>
    <version>3.3.2</version>
</dependency>

公式のみるとslf4jも入れたほうが良いようですね(今回は省略しましたが一応動いてます)。

今日時点で最新の3.3.2は2014年3月24日にリリースされたものなので、わりと最近でもメンテされてるライブラリのようです。

3系の最新定義するなら上記pom.xmlのversionタグを

<version>[3,)</version>

のように指定してもいいかもしれません。

maven-apt-pluginの定義

コード自動生成のためにpom.xmlのbuildタグ内のpluginsで以下定義を追加します。

<plugin>
    <groupId>com.mysema.maven</groupId>
    <artifactId>maven-apt-plugin</artifactId>
    <version>1.0</version>
    <executions>
      <execution>
        <goals>
          <goal>process</goal>
        </goals>
        <configuration>
          <outputDirectory>target/generated-sources/java</outputDirectory>
          <processor>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor>
        </configuration>
      </execution>
    </executions>
  </plugin>

今回Java EE 7、GlassFish 4.0でサンプルを作りましたが、Entityの生成などはJava EE 6と同様にNetBeans任せで、データベースから自動的に作りました。

そしてビルドすると

f:id:kikutaro777:20140421223509j:plain

EntityのActress.java(NetBeansから自動生成したEntity)に対してQActress.java(Querydls&aptで自動生成)が出来ています。

テーブルサンプル

Actressテーブルは以下定義しました。

ID 名前 年齢
1 堀北真希 25
2 橋本環奈 15
3 橋本愛 18
4 能年玲奈 20
5 有村架純 21

サンプルコード

堀北さんをピンポイントで拾ってみます。EJBで

public Actress getHorikita(){
    QActress actress = QActress.actress;
    JPQLQuery query = new JPAQuery(em, EclipseLinkTemplates.DEFAULT);
    return query.
            from(actress).
            where(actress.name.eq("堀北真希")).
            uniqueResult(actress);
}
[ id:1, name:堀北真希, age:25 ]

橋本さんをlike文で検索して、名前でソート昇順に。

public List<Actress> getHashimoto(){
    QActress actress = QActress.actress;
    JPQLQuery query = new JPAQuery(em, EclipseLinkTemplates.DEFAULT);
    return query.
            from(actress).
            where(actress.name.like("橋本%")).
            orderBy(actress.name.asc()).
            list(actress);
}
[[ id:3, name:橋本愛, age:18 ], [ id:2, name:橋本環奈, age:15 ]]

成人した女優さん達は

public List<Actress> getAdult(){
    QActress actress = QActress.actress;
    JPQLQuery query = new JPAQuery(em, EclipseLinkTemplates.DEFAULT);
    return query.
            from(actress).
            where(actress.age.goe(20)).
            list(actress);
}
[[ id:1, name:堀北真希, age:25 ], [ id:4, name:能年玲奈, age:20 ], [ id:5, name:有村架純, age:21 ]]

goeは「>=」でgtが「>」。逆はloe、lt。

テーブルが超簡易なのであれですが、良い感じ!
もう少し複雑なクエリ組んでみよう。

これ採用してもいいんじゃないかなー。開発元はmysemaというフィンランドの企業がやっているらしい。

コードはGitHubで管理されてて、わりと活発そうです。
https://github.com/mysema/querydsl

発行されるJPQLをどうやって確認できるのかな?と思ったのですが、普通にNetBeansでも表示されてるっぽい。

f:id:kikutaro777:20140421233638j:plain

にほんブログ村 IT技術ブログへ
にほんブログ村 にほんブログ村 IT技術ブログ Javaへ
にほんブログ村