Home > JAVAなお話

このコラムでは、PHP・Perlなどの技術的なことを書いていこうと思います。

それほど更新頻度は高くないと思いますが、つまらない事から難しい事まで

書けたら良いなぁ~と思っています。

世の中いろいろ

JPAでnative SQLをPOJOに格納する

もう何年振りかって感じで書く。

単純に忙しいのもあるが、書くのがめんどくさくなっただけ(笑)
技術的なことや仕事的なことを書く場所として用意していたが
ここ数年、特に書くことになかった(ゼロではないんだが…)様な気がする

しばらくPHPなどのスクリプト言語から離れ、JAVAを一から始めたので
書けるようなことに特になくなぁなぁとしてしまった



今回は、play framework on javaについて書こうかと思う

基本的にScala向けにあるようなFWなのかな
Scalaもちょっと(ほんとにちょっと)だけやっているので便利さはわかるもののやはりまだJAVAの方が落ち着く

play frameworkは、便利な反面結構な個所でイライラさせられる
まず、コンパイルが長すぎる(・.・;)
シングルプロジェクトとマルチプロジェクトでは、設定に結構な違いがある(・.・;) (今度書きます
O/RマッパーはJPAが標準なので結構曲者(・.・;)


と今回は、表題のとおりJPAでnonEntityPoJoに値を格納する方法を書きます

JPAは、基本的にentity定義してentityMapperに登録するといい感じにテーブル作成して簡単に参照・更新が出来るとても便利な
O/Rマッパーです

ただ、NativeQueryを扱う場合は、注意が必要
ググったがあまり情報が少なかったのでそのやり方を書きます

まず、HogeとFugaのEntityを定義してそれぞれのnameをとってみます


@Entity
public class Hoge extends JPABase {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Integer id;

@Constraints.MaxLength(50)
@Column(length = 50, nullable = true)
public String name;
}

@Entity
public class Fuga extends JPABase {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Integer id;

@Constraints.MaxLength(50)
@Column(length = 50, nullable = true)
public String name;
}

public class LikeStatus {

@Data
public static class NamedByHogeAndFuga implements Serializable {
private String hogeName;
private String fugaName;

}

public static void judge(Long accountId) {
Session session = JPA.em().unwrap(Session.class);
SQLQuery sqlQuery = session.createSQLQuery(
"SELECT h.name AS hogeName, f.name AS fugaName"
+ " FROM Hoge h " + " inner join FUga ai using(id)";
sqlQuery.setResultTransformer(Transformers.aliasToBean(NamedByHogeAndFuga.class));
List responses = sqlQuery.list();

for (NamedByHogeAndFuga response : responses) {
Logger.info("hogeName:" + response.getHogeName());
Logger.info("fugaName:" + response.getFugaName());
}
}

}


*@SqlResultSetMapping*とかマッパーを使え的な記事はたくさん見つかったがどれもentityMapperを使わないと受け取れなかったので
求めているものと違った
*JPA.em().createNamedQuery("native sql", MyClass.class)*のように*@SqlResultSetMapping*取れるようなのだ


今回のミソは、*JPA.em().unwrap(Session.class);*のようだ(Session.classがどのようなものかはまだ調べていない・・・汗
あとは、*Transformers.aliasToBean*でCastを行ってくれるようだ


解ってしまえば大したことないのだが、今後はかなり役に立つと思われる

ただし、定義したEntityで事足りるようにコードを書く方が、ベターなのかもしれない
  • TrackBack (Close): -

More...

Home > JAVAなお話

Recent Entries
Search
Feeds

Page Top