我正在使用 postgress 開發一個 spring boot 項目。我在將 jpa 本機查詢(使用表連接)結果列表解析為 JSONObject 時遇到問題我有兩張桌子create table person( id serial primary key, name varchar(50));create table contacts( id serial primary key, person_id int, key varchar(50), value varchar(100), foreign key (person_id) references person (id));表格中的示例數據insert into person values (1, 'A');insert into person values (2, 'B');insert into contacts values (1, 1, 'EMAIL', '[email protected]');insert into contacts values (2, 1, 'PHONE', '123');insert into contacts values (3, 2, 'EMAIL', '[email protected]');insert into contacts values (4, 2, 'PHONE', '456');使用本機查詢獲取數據的 Spring 引導代碼。String query = "select p.id, p.name, c.key, c.value from person p LEFT JOIN contacts c on p.id = c.person_id";Query nativeQuery = entityManager.createNativeQuery(query);List<Object[]> resultList = nativeQuery.getResultList();我想將輸出作為 JSONObject 的列表[{ "id": 1, "name": "A", "contacts": [{ "key": "EMAIL", "value": "[email protected]" }, { "key": "PHONE", "value": "123" } ] }, { "id": 2, "name": "B", "contacts": [{ "key": "EMAIL", "value": "[email protected]" }, { "key": "PHONE", "value": "456" } ] }]或者結果應該直接進入 POJOList<Person> resultList = nativeQuery.getResultList();在這種情況下,我有一個帶有 @OneToMany 注釋的人員類和聯系人類。
1 回答

不負相思意
TA貢獻1777條經驗 獲得超10個贊
演示:db<>fiddle(本機查詢)
SELECT?
? ? json_agg(json_person)
FROM
? ? person p
JOIN (
? ? SELECT
? ? ? ? person_id,
? ? ? ? json_agg(json_contacts) AS contacts
? ? FROM
? ? ? ? contacts,
? ? ? ? json_build_object('key', key, 'value', value) as json_contacts
? ? GROUP BY person_id
) c
ON c.person_id = p.id,
json_build_object('id', p.id, 'name', p.name, 'contacts', c.contacts) AS json_person
文檔:Postgres JSON 函數
您必須使用創建一個 JSON 對象json_build_object()
并將這些結果聚合到一個數組中json_agg()
。兩次。
免責聲明:如評論中所述:在這種情況下,兩個表的簡單 JOIN 就可以將邏輯傳輸到 Java 后端。我猜,因為您使用的是 JPA,所以您只有實體管理器中的數據。因此,使用 Java 工具(例如gson
)生成 JSON 對象將是比調用數據庫更好的選擇。但這當然取決于您的用例和設置。
添加回答
舉報
0/150
提交
取消