Hibernate Native Query

avatar
Joy
9 августа 2021 в 07:08
110
2
0

Я хочу написать нативный запрос "Выбрать * из таблицы" в своем репозитории. Имя таблицы отличается от имени объекта.

При выполнении запроса

1, если я ввожу имя объекта, оно возвращает Таблица не найдена.

2, если я помещу имя таблицы в запрос, я получу сообщение Проверка не удалась для запроса.

Запросы

@Transactional
    @Query(
            value = "Select * from " +
                    "TariffPacks r2 where r2.TariffID = :tariffId " +
                    "and r2.regionname = :regionname " +
                    "and r2.category = :category " +
                    "and r2.amount = :amount " +
                    "and r2.operator = :operator", nativeQuery = true
    )
    List<TariffPacks> findByTariffID_RegionName_Category_Amount_Operator(
            @Param("tariffId") Long tariffId,
            @Param("regionname") String regionname,
            @Param("category") String category,
            @Param("amount") Integer amount,
            @Param("operator") String operator
    );

    @Transactional
    @Modifying
    @Query(
            value = "Delete from " +
                    "TariffPacks r2 where r2.TariffID = :tariffId " +
                    "and r2.regionname = :regionname " +
                    "and r2.category = :category " +
                    "and r2.amount = :amount " +
                    "and r2.operator = :operator"
    )
    List<TariffPacks> deleteByTariffID_RegionName_Category_Amount_Operator(
            @Param("tariffId") Long tariffId,
            @Param("regionname") String regionname,
            @Param("category") String category,
            @Param("amount") Integer amount,
            @Param("operator") String operator
    );

Если я использую «Выбрать * из тарифных пакетов r2 ... nativeQuery = true», я получаю сообщение об ошибке «Тарифные пакеты не существуют». Если я использую «Выбрать * из RECHARGEDATAPACKS r2 .. nativeQuery = true», я получаю ошибку проверки в Hibernate.

Объект:

import lombok.*;

import javax.persistence.*;
import java.time.LocalDateTime;

@Data
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "RECHARGEDATAPACKS")
public class TariffPacks {
    @Id
    @GeneratedValue(generator = "RECHARGEDATAPACKS_SEQ")
    @SequenceGenerator(name = "RECHARGEDATAPACKS_SEQ", sequenceName = "RECHARGEDATAPACKS_SEQ", allocationSize = 1)
    // @GeneratedValue(strategy = GenerationType.AUTO)
    private Long packid;

    private Long TariffID;
    private String operator;
    private String operatoralias;
    private String regionname;
    private String regionalias;
    private String category;
    private Integer amount;
    private String talktime;
    private String validity;
    private String description;
    private String billercategory;
    private String updatedOn;
    private String entryDate;

}

У меня три вопроса: 1 Как заставить hibernate искать имя таблицы (RECHARGEDATAPACKS) при использовании nativeQuery = true?

2 Могу ли я написать «Выбрать *» в Hibernate без использования nativeQuery = true? Я думаю, что мне нужно написать все имена столбцов, такие как TariffId, Operator, region .. но я хочу, чтобы сущность была возвращена. Как сопоставить все столбцы с сущностью в выводе?

3 Есть ли другой способ записать имена отдельных столбцов и сопоставить их с классом сущностей? Например, если я пишу Select TariffId, Operator, region.. как я могу получить тарифный идентификатор напрямую?

Источник
Simon Martinelli
9 августа 2021 в 07:36
0

Вы должны использовать имя таблицы. Как выглядит ошибка проверки?

Joy
9 августа 2021 в 08:51
0

Теперь он работает с именем таблицы вместо имени объекта, не знаю, почему он продолжал выдавать ошибки.

Simon Martinelli
9 августа 2021 в 08:56
0

Тогда ответ на ваш вопрос?

Joy
9 августа 2021 в 17:59
0

да, но другие вопросы все еще там.

Joy
10 августа 2021 в 09:33
0

@SimonMartinelli Ошибка гибернации, которую я периодически получаю: вызвано: java.lang.IllegalStateException: org.hibernate.hql.internal.QueryExecutionRequestException: не поддерживается для операций DML [Удалить из com.telecomwatch.process.entity.TariffPacks r2, где r2.TariffID = :tariffId и r2.regionname = :regionname и r2.category = :category и r2.amount = :amount и r2.operator = :operator] в org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery. java:1607) в org.hibernate.query.Query.getResultList(Query.java:165)

Ответы (2)

avatar
Ajit Singh
9 августа 2021 в 09:45
1

1, если я ввожу имя объекта, оно возвращает Таблица не найдена.

Если вы используете nativeQuery = true, вам нужно написать Имя таблицы.

    @Transactional
@Query(value = "Select * from " + "RECHARGEDATAPACKS r2 where r2.TariffID = :tariffId "
        + "and r2.regionname = :regionname " + "and r2.category = :category " + "and r2.amount = :amount "
        + "and r2.operator = :operator", nativeQuery = true)
List<TariffPacks> findByTariffID_RegionName_Category_Amount_Operator(@Param("tariffId") Long tariffId,
        @Param("regionname") String regionname, @Param("category") String category, @Param("amount") Integer amount,
        @Param("operator") String operator);

2, если я помещу имя таблицы в запрос, я получу сообщение Проверка не удалась для запроса.

Я пытался использовать тот же код, и все работает нормально. укажите точную ошибку/исключение.

1 Как заставить спящий режим искать имя таблицы (RECHARGEDATAPACKS) при использовании nativeQuery = true?

If using nativeQuery = true then you have to provide table name only, else you can write HQL/JPQL with entity class name.

2 Могу ли я написать «Выбрать *» в Hibernate без использования nativeQuery = true? Я думаю, что мне нужно написать все имена столбцов, такие как TariffId, Operator, region .. но я хочу, чтобы сущность была возвращена. Как сопоставить все столбцы с сущностью в выводе?

Вы можете написать так:

@Query(value = "from " + "TariffPacks r2 where r2.TariffID = :tariffId " + "and r2.regionname = :regionname " + "and r2.category = :category " + " and r2.amount = :amount " + "and r2.operator = :operator")

3 Есть ли другой способ записать имена отдельных столбцов и сопоставить их с классом сущностей? Например, если я пишу Select TariffId, Operator, region.. как мне напрямую получить тарифId?

Вы можете сделать так:

    @Query(value = "select TariffID, category from RECHARGEDATAPACKS where packid = :packid", nativeQuery = true)
List<Object[]> someMethodName(Long packid);

и затем вы можете извлечь.

Joy
10 августа 2021 в 11:22
0

Кажется, проблема в том, что если у меня нет возвращаемого типа удаления типа void, возникает эта ошибка. Как я могу переформулировать запрос, чтобы получить количество удаленных строк?

avatar
coladict
9 августа 2021 в 07:56
0

При использовании собственного запроса необходимо использовать имя таблицы, а не имя сущности. Вы также должны использовать имена столбцов базы данных вместо имен полей Java.

При использовании чужих запросов (известных как JPQL или HQL в спящем режиме) вы должны использовать имена объектов и полей. Вместо select * from Entity e ... используется синтаксис select e from Entity e ....

.
Joy
10 августа 2021 в 09:31
0

Ошибка гибернации, которую я периодически получаю: Причина: java.lang.IllegalStateException: org.hibernate.hql.internal.QueryExecutionRequestException: Не поддерживается для операций DML [Удалить из com.telecomwatch.process.entity.TariffPacks r2, где r2. TariffID = :tariffId и r2.regionname = :regionname и r2.category = :category и r2.amount = :amount и r2.operator = :operator] в org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java: 1607) в org.hibernate.query.Query.getResultList(Query.java:165)

Joy
10 августа 2021 в 09:42
0

Кажется, проблема в том, что если у меня нет возвращаемого типа удаления типа void, возникает эта ошибка. Как я могу переформулировать запрос, чтобы получить количество удаленных строк?

coladict
10 августа 2021 в 09:58
0

Для запросов на удаление/обновление нельзя использовать getResultList или getSingleResult. Вы должны использовать executeUpdate, потому что результатом являются не строки, а количество затронутых строк.