teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

ソースコードサンプルを追記

2019/09/22 14:13

投稿

q_sane_q
q_sane_q

スコア610

answer CHANGED
@@ -5,4 +5,81 @@
5
5
  そしたら検索で返ってきてるのはTelDataクラスで、そこにはgroupNameというフィールドは存在しないので受け取りできていないと思います
6
6
  単純に取得するだけならTelDataクラスにgroupNameを作れば動くのではないでしょうか?
7
7
 
8
- ただTelDataテーブルにはgroupNameという列はないので、それを示すアノテーション@Transientをつけないといけなかったと思います
8
+ ただTelDataテーブルにはgroupNameという列はないので、それを示すアノテーション@Transientをつけないといけなかったと思います
9
+
10
+ クエリを柔軟にできるので自分がよくやるやり方(コメントの3)は↓の感じで(ddl-auto: create はいつも付けてない)
11
+ ```Java
12
+ // テーブルに対応したEntity
13
+ @Data
14
+ @Entity
15
+ public class TelData {
16
+
17
+ @Id
18
+ @GeneratedValue
19
+ private Long id;
20
+ private String userName;
21
+ private String telNo;
22
+ private String mailAddr;
23
+ private Long groupId;
24
+ }
25
+ ```
26
+ ```
27
+ // JOINなどをした検索結果を受け付けるEntity(名前は何でも)
28
+ @Data
29
+ @Entity
30
+ public class TelData2 {
31
+
32
+ @Id
33
+ private Long id;
34
+ private String userName;
35
+ private String telNo;
36
+ private String mailAddr;
37
+ private Long groupId;
38
+ private String groupName;
39
+ }
40
+ ```
41
+ ```Java
42
+ @Repository
43
+ public interface TelDataRepository extends JpaRepository<TelData, Long>, TelDataRepositoryCustom {
44
+ }
45
+ ```
46
+ ```Java
47
+ // カスタムクエリ用Repositoryインタフェース 名前はリポジトリインタフェース名 + Custom
48
+ public interface TelDataRepositoryCustom{
49
+ public List<TelData2> findTelDataGroup();
50
+ }
51
+ ```
52
+ ```Java
53
+ // カスタムクエリ用Repositoryクラス 名前はリポジトリインタフェース名 + Impl
54
+
55
+ import java.util.List;
56
+ import javax.persistence.EntityManager;
57
+ import javax.persistence.Query;
58
+ import org.springframework.beans.factory.annotation.Autowired;
59
+
60
+ public interface TelDataRepositoryImpl implements TelDataRepositoryCustom {
61
+
62
+ @Autowired EntityManager entityManager;
63
+
64
+ public List<TelData2> findTelDataGroup(){
65
+
66
+ String sql = "SELECT d.id,d.user_name,d.tel_no,d.mail_addr,g.group_name,null AS group_id "
67
+ + "FROM tel_data d "
68
+ + "LEFT JOIN tel_group g ON d.group_id = g.group_id";
69
+
70
+ Query query = entityManager.createNativeQuery(sql, TelData2.class);
71
+ List<TelData2> list = (List<TelData2>)query.getResultList();
72
+ return list;
73
+ // キャストの警告が出るので気になったら@SuppressWarningsアノテーションで消す
74
+ }
75
+ }
76
+ ```
77
+
78
+ で、
79
+ ```Java
80
+ // telDataRepository はTelDataRepository(TelDataRepositoryCustomやTelDataRepositoryImplではない)
81
+ telDataRepository.findTelDataGroup();
82
+ ```
83
+ を使って呼び出した結果を画面に返して使用する。
84
+ インタフェースやクラスが増えることとやや複雑になるデメリットはありますが、
85
+ クエリ・結果を比較的自由に弄れるので個人的にはよくやっています。