Используется для документирования различных проблем, с которыми я столкнулся при использовании spring data jpa и их решений.
Пользовательские операторы запросов (@Query и nativeQuery)
Нужно только добавить @query в метод, а HQL используется по умолчанию следующим образом: NetworkInfo — это соответствующий класс сущности
@Query("SELECT count(n.network) FROM NetworkInfo n where network=?1")
Long countDeviceNumByNetwork(String network);
Если вам нужно использовать оператор SQL базы данных, вам нужно добавить nativeQuery = true в аннотации @query, такие как @query (значение = «xxx», nativeQuery = true) следующим образом:
@Query(value = "SELECT network_type,count(network_type) as count FROM network_manage WHERE network = ?1 " +
"and TIMESTAMPDIFF(YEAR,(CASE WHEN DATE(in_net_date) is NULL THEN " +
"CONCAT(in_net_date,'/01/01') ELSE in_net_date END),NOW())>=?2 GROUP BY network_type", nativeQuery = true)
List<Object[]> countDeviceNumInNetDateMoreThanYEARSIntGroupByNetworkType(String network, int years);
Возвращает пользовательский объект запроса (например, «выберите новую карту (xx, xx, xx)»)
Вы можете использовать HQL в аннотациях для возврата пользовательских объектов Пример: @Query("выбрать новый XXX(XX)") Карта, возвращаемая по умолчанию, представляет собой порядковый номер в качестве ключа (например, 0,1,2). Пример:
@Query("SELECT new Map(manufacturer,networkType,count(manufacturer)) FROM NetworkInfo WHERE network = ?1 " +
"GROUP BY manufacturer,networkType")
List<Map<String, Object>> countDeviceNumGroupByManufacturerAndNetworkType(String network);
Если используется nativeQuery, запись по умолчанию возвращается как Object[]. Пример см. в пользовательском операторе запроса выше.
Проблемы, связанные с отображением полей
Разрешение именования полей
Когда я использую spring boot + spring data jpa, правило сопоставления имен таблиц по умолчанию заключается в замене прописных букв символами подчеркивания + строчными буквами (a_aa_aa), когда встречаются прописные буквы (например, aAaAa). Как правило, соглашение об именах переменных в JAVA соответствует случаю верблюда. В это время база данных встречает поле «portDesc», и имя переменной моего класса сущности также является portDesc. В это время portDesc будет проанализирован как « port_desc", а затем сообщить об ошибке. Я проверил два решения 1. Самое удобное решение — добавить в поле @Column(name="portdesc") (при условии, что ваша база данных не чувствительна к регистру?) 2. Также есть способ изменить стратегию парсинга (конфигурация весенней загрузки):
spring.jpa.hibernate.naming.physical-strategy = org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
Однако этот подход использует разрешение горба правила по умолчанию для подчеркивания ошибки.
разрешение типа поля
При использовании сопоставления я столкнулся с такими типами полей, как text, longtext, set и т. д., и было сообщено об ошибке при использовании правил сопоставления по умолчанию, которые нельзя получить напрямую с помощью String. Решение @Column(columnDefinition="XXX").
@Transient
Когда мы добавляем переменную-член в класс сущности, которая не соответствует таблице базы данных один к одному, нам нужно только добавить аннотацию @Transient к этой переменной-члену.
нумерация страниц
Пейджинговый запрос через Pageableblog.CSDN.net/U011848397/…
Несколько способов реализации пейджинга (включая HQL или собственный sql)Блог Woohoo.cn на.com/Pirate King/Fear/78…
Spring Data JPA: нумерация страниц и сортировкаblog.CSDN.net/U011848397/…