Определить сущность с помощью пользовательского запроса SQL в Hibernate 5.1 - PullRequest
0 голосов
/ 09 мая 2018

Я работаю с ненормализованной сторонней базой данных, что означает, что я не могу изменить схему. Я пытаюсь сопоставить таблицы с сущностями JPA, используя Hibernate 5.1

Есть 2 простых таблицы A и B :

|  A_ID(pk) |      |  B_ID(pk) |
-------------      -------------
|    1      |      |    1      |
-------------      |    2      |
                   -------------

Таблица C имеет составной первичный ключ и имеет отношение «многие к одному» с таблицей A:

|   A_ID(pk&fk)   | QUANTITY(pk) | VALID_FROM(pk) |
---------------------------------------------------
|     1           |      1       |  2017-05-21    |
|     1           |      1       |  2018-01-01    |
|     1           |      2       |  2017-05-21    |

Таблица D имеет составной первичный ключ:

|   A_ID(pk&fk)   | QUANTITY(pk) | VALID_FROM(pk) |   B_ID(pk&fk)  | 
--------------------------------------------------------------------
|     1           |      1       |  2018-01-21    |     1          | 
|     1           |      2       |  2018-01-21    |     1          | 
|     1           |      2       |  2018-05-01    |     2          | 

столбец VALID_FROM не является частью условия соединения между таблицами и может принимать любое значение.

Я пытаюсь установить связь между таблицами C и D, но из-за компонента первичного ключа VALID_FORM они не могут быть смоделированы с Many-To-One. А поскольку таблицы соединений нет, они также не могут быть смоделированы с помощью Many-To-Many.

Лучшее решение - создать вид, подобный

CREATE VIEW C_NORM AS
  SELECT DISTINCT A_ID, QUANTITY 
  FROM TABLE_C;

, который будет производить представление C_NORM :

 |   A_ID(pk&fk)   | QUANTITY(pk) |
 ----------------------------------
 |     1           |      1       |
 |     1           |      2       |

Создание объекта C_NORM в этом представлении может иметь

  • отношение «один ко многим» с таблицей C
  • и еще одно отношение «один ко многим» с таблицей D

но я не могу изменить схему, поэтому не могу создать новый вид.

Есть ли способ определить сущность как класс с аннотациями, который в основном основан на собственном запросе SQL, а не на представлении или таблице в БД?

1 Ответ

0 голосов
/ 09 мая 2018

Нет, это невозможно и не имеет смысла.

Объекты для обновления, вставки и удаления. Если вы не хотите выполнять какие-либо из этих операций, вы не должны использовать сущности.

Вы можете использовать @SqlResultSetMapping для отображения результата собственного запроса в класс

Query q = em.createNativeQuery(
    "SELECT c.id, c.name, COUNT(o) as orderCount, AVG(o.price) AS avgOrder " +
    "FROM Customer c " +
    "JOIN Orders o ON o.cid = c.id " +
    "GROUP BY c.id, c.name",
    "CustomerDetailsResult");

@SqlResultSetMapping(name="CustomerDetailsResult",
    classes={
    @ConstructorResult(targetClass=com.acme.CustomerDetails.class,
        columns={
            @ColumnResult(name="id"),
            @ColumnResult(name="name"),
            @ColumnResult(name="orderCount"),
            @ColumnResult(name="avgOrder", type=Double.class)})
})

Или используйте QLRM: https://github.com/simasch/qlrm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...