賞金明天到期。_ 此問題的答案有資格獲得 100聲望賞金。 ATW正在尋找這個問題的更詳細的答案。
我有一個用 JPA 構建的資料庫結構。給出一點背景關系 - 向用戶顯示一個資料表和一些(許多......)過濾器,他可以使用這些過濾器過濾資料表的顯示條目。例如,資料表的每個條目對應于某個工廠(例如總共40個工廠),用戶可以過濾一個或多個工廠。
為防止開銷,用戶只能按構建資料表的資料集中出現的工廠進行過濾,即過濾后將給出空結果的工廠(因為該工廠沒有任何條目)根本不顯示.
此外,資料表是分頁的,即只有第一個(第二個、第三個等)50 個條目被提供給前端但是 - 這是關鍵點 - 過濾器當然應該對應于所有條目(ip 也是條目在未顯示的頁面上)。這意味著如果工廠 B 僅出現在第 2 頁并且加載了第 1 頁(即在顯示的條目下沒有工廠 B 對應于前端接收的條目),工廠過濾器仍應列出工廠 B。
我的方法如下:在構造結果時,使用相同的 sql 查詢,我得到所有可以過濾的值。所以我的構造表看起來可以這樣說
factory | status | ...
F1 | done | ...
F2 | in progress | ...
F1 | in progress | ...
包含所有頁面上的條目(其中只有第一個(第二個,第三個,...)50 個條目被提供給前端)投影到可以過濾的屬性。
現在我只是通過例如SELECT DISTINCT(entry.factory) FROM ...鍵入查詢來獲取需求值。CREATE VIEW基本上,此時我會創建一個構造表的 sql 視圖,然后獲取 1)所有不同的工廠,2)所有不同的狀態,等等。但是 JPA在創建型別化查詢時不允許這樣做,對于每一列,我構造同一個表(上面的那個)并獲取當前列中的不同值。
(只是為了完整性:出于性能原因,不可能獲取所有物體然后迭代,例如使用流 API 對映射到“可過濾”屬性的結果串列使用流 API,即過濾必須直接在資料庫中進行使用 SQL(我猜?))
我有兩個問題:
- 這種實作是否合理?
- 如果是,我該如何處理創建視圖的想法?理想情況下,直接通過 JPA,但不幸的是我沒有找到使用 JPA 來解決這個問題的真正方法。
編輯:將其分解為非常基本的問題:
QueryPart queryPart = new QueryPartDTO("<some JPA query>");
QueryFactory<MyEntity> queryFactory = new QueryFactory<>();
final TypedQuery<MyEntity> query = queryFactory.buildTypedQuery(queryPart, entityManager, MyEntity.class);
List<MyEntity> resultList = query.getResultList();
// at this point, the query fires ↑
// that's okay because I do need the List<Entity> in order to give it to the frontend
// but instead of just getting a List<MyEntity>,
// I would like to have a sql view containing the result (resp. the whole result) as well
// because moreover, I have to get e.g. all factories, all statuses, etc.
// which occur in the given data - what could of course be done with
// the already given List<MyEntity> using the Stream API but since the list
// is in general very large, this approach would be to inefficient.
// Instead, I would like to do these computations using SQL - but for this,
// I need the data given by the constructed query above in a SQL table.
// Executing the query over and over again (and first, getting all distinct factories,
// second getting all distinct statuses, etc.) is not possible for
// performance reasons - the query is expensive. Hence, I need to
// save the result the query gives - in a way, I can execute some more
// queries on it: a view i guess.
提前致謝。
uj5u.com熱心網友回復:
JPA 確實不支持視圖創建。它不支持任何 DDL 查詢。
動態視圖創建是一個可疑的想法。通常您只設計一次資料庫方案。此外,您需要為不同的用戶提供單獨的視圖,這聽起來像是一場噩夢。
您可以做的是創建一個包含用戶過濾結果的表,并以用戶 ID 為鍵。每當用戶應用他的過濾器時,您都可以DELETE為該用戶提供舊結果行和INSERT新結果行。然后SELECT DISTINCT對這個較小的資料集進行查詢。
JPA 不會在這方面為您提供太多幫助,因為它不支持INSERT SELECT您想在此處使用的SQL 陳述句。
編輯。我更改了此答案以在下面保留有用的評論。以前的版本完全不同,無論如何也沒有用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/420545.html
標籤:
