回答編集履歴

1

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

2019/09/22 14:13

投稿

q_sane_q
q_sane_q

スコア610

test CHANGED
@@ -13,3 +13,157 @@
13
13
 
14
14
 
15
15
  ただTelDataテーブルにはgroupNameという列はないので、それを示すアノテーション@Transientをつけないといけなかったと思います
16
+
17
+
18
+
19
+ クエリを柔軟にできるので自分がよくやるやり方(コメントの3)は↓の感じで(ddl-auto: create はいつも付けてない)
20
+
21
+ ```Java
22
+
23
+ // テーブルに対応したEntity
24
+
25
+ @Data
26
+
27
+ @Entity
28
+
29
+ public class TelData {
30
+
31
+
32
+
33
+ @Id
34
+
35
+ @GeneratedValue
36
+
37
+ private Long id;
38
+
39
+ private String userName;
40
+
41
+ private String telNo;
42
+
43
+ private String mailAddr;
44
+
45
+ private Long groupId;
46
+
47
+ }
48
+
49
+ ```
50
+
51
+ ```
52
+
53
+ // JOINなどをした検索結果を受け付けるEntity(名前は何でも)
54
+
55
+ @Data
56
+
57
+ @Entity
58
+
59
+ public class TelData2 {
60
+
61
+
62
+
63
+ @Id
64
+
65
+ private Long id;
66
+
67
+ private String userName;
68
+
69
+ private String telNo;
70
+
71
+ private String mailAddr;
72
+
73
+ private Long groupId;
74
+
75
+ private String groupName;
76
+
77
+ }
78
+
79
+ ```
80
+
81
+ ```Java
82
+
83
+ @Repository
84
+
85
+ public interface TelDataRepository extends JpaRepository<TelData, Long>, TelDataRepositoryCustom {
86
+
87
+ }
88
+
89
+ ```
90
+
91
+ ```Java
92
+
93
+ // カスタムクエリ用Repositoryインタフェース 名前はリポジトリインタフェース名 + Custom
94
+
95
+ public interface TelDataRepositoryCustom{
96
+
97
+ public List<TelData2> findTelDataGroup();
98
+
99
+ }
100
+
101
+ ```
102
+
103
+ ```Java
104
+
105
+ // カスタムクエリ用Repositoryクラス 名前はリポジトリインタフェース名 + Impl
106
+
107
+
108
+
109
+ import java.util.List;
110
+
111
+ import javax.persistence.EntityManager;
112
+
113
+ import javax.persistence.Query;
114
+
115
+ import org.springframework.beans.factory.annotation.Autowired;
116
+
117
+
118
+
119
+ public interface TelDataRepositoryImpl implements TelDataRepositoryCustom {
120
+
121
+
122
+
123
+ @Autowired EntityManager entityManager;
124
+
125
+
126
+
127
+ public List<TelData2> findTelDataGroup(){
128
+
129
+
130
+
131
+ String sql = "SELECT d.id,d.user_name,d.tel_no,d.mail_addr,g.group_name,null AS group_id "
132
+
133
+ + "FROM tel_data d "
134
+
135
+ + "LEFT JOIN tel_group g ON d.group_id = g.group_id";
136
+
137
+
138
+
139
+ Query query = entityManager.createNativeQuery(sql, TelData2.class);
140
+
141
+ List<TelData2> list = (List<TelData2>)query.getResultList();
142
+
143
+ return list;
144
+
145
+ // キャストの警告が出るので気になったら@SuppressWarningsアノテーションで消す
146
+
147
+ }
148
+
149
+ }
150
+
151
+ ```
152
+
153
+
154
+
155
+ で、
156
+
157
+ ```Java
158
+
159
+ // telDataRepository はTelDataRepository(TelDataRepositoryCustomやTelDataRepositoryImplではない)
160
+
161
+ telDataRepository.findTelDataGroup();
162
+
163
+ ```
164
+
165
+ を使って呼び出した結果を画面に返して使用する。
166
+
167
+ インタフェースやクラスが増えることとやや複雑になるデメリットはありますが、
168
+
169
+ クエリ・結果を比較的自由に弄れるので個人的にはよくやっています。