JPA自定義物件接收查詢結果集
阿新 • • 發佈:2019-02-01
最近使用JPA的時候,碰到需要自定義查詢結果集的場景,網上搜了一下,都是需要自定義方法寫一大串程式碼實現的,太繁瑣了,有那時間還不如用mybaits。用JPA就是要儘量通過宣告介面解決持久層問題,要不然鬼用。逼得沒辦法去了官網看看文件,再沒有就放棄了,沒時間看原始碼。最終找到我想要的結果了。
例如,傳統的JPA介面實現如下所示:
class Person { @Id UUID id; String firstname, lastname; Address address; static class Address { String zipCode, city, street; } } interface PersonRepository extends Repository<Person, UUID> { Collection<Person> findByLastname(String lastname); }
自定義物件接收查詢結果集方法如下:
(1)增加接收資料介面
interface NamesOnly {
String getFirstname();
String getLastname();
}
(2)增加持久層介面
interface PersonRepository extends Repository<Person, UUID> {
Collection<NamesOnly> findByLastname(String lastname);
}
如果要對查詢結果進行序列號的話就會有點問題:
{ "errorCode": "00", "errorMessage": "操作成功", "returnObject": [ { "createtime": 1526358195000, "id": 49, "lastupdatetime": 1526358195000, "status": "2", "target": { "createtime": 1526358195000, "lastupdatetime": 1526358195000, "check_Wicket": "1", "facility_name": "血壓測量", "facility_Num": "C3", "id": 49, "status": "2", "check_name": "小湯154", "check_Num": "BY185201805140001" }, "targetClass": "org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap" } ] }
會出現targetClass這個欄位,不能直接把結果拿來用,很噁心,又不想寫程式碼中轉下。
經過後來的摸索,其實如果只是為了返回JSON,也可以直接在Repository層直接用List<Map<String,Object>>
來返回,
Map<String,Object>對應單條查詢結果,完美解決序列化問題。
完畢。就這麼簡單。