1. 程式人生 > >JPA自定義物件接收查詢結果集

JPA自定義物件接收查詢結果集

最近使用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>對應單條查詢結果,完美解決序列化問題。

完畢。就這麼簡單。