Как удалить / получить список с использованием JPA в Spring Boot Application - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть сущность :

@Entity
@Table(name ="cats")
public class Cat {
    @Id
    @Column(name="name")
    private String name;

    @Column(name="age")
    private int age;

    @Column(name="color")
    private String color;

    @Column(name="weight")
    private int weigth;
  ..
}

1 .Мне нужно удалить из базы данных, используя EntityManager :

@Override
public void delete(Cat cat) {
    entityManager.remove(cat);
}

Проблема : У меня есть Map<String, Cat>, который содержит все эти элементы.Я получаю его по имени с карты IllegalArgumentException -> "Удаление отдельного экземпляра com.entities.Cat # cats".

Вопрос : Как я могу это сделать без получения из базы данных по ключу?

2 .Мне нужно получить getList с limit и offset .

К получить все элементы, которые я могу просто использовать:
entityManager.createNativeQuery("SELECT name, age, color, weight FROM cats");

Без entityManager я использовал prepatedStatement с:

"SELECT name, age, color, weight FROM cats LIMIT ?,?"

Вопрос :
Как я могусделать это, используя entityManager ?
У entityManager есть что-то вроде prepareStatement

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019
  1. Если вам нужно использовать EntityManager, просто используйте ссылку:

    entityManager.remove(entityManager.getReference(Cat.class, id));
    

    Таким образом, сущность не будет извлечена из БД, но будет удалена.

    Использование запроса также является опцией:

    Query query = entityManager.createQuery("delete from Entity e where e = :entity");
    query = query.setParameter("entity", entity);
    query.executeUpdate();
    
  2. Вы можете создать Query, используя EntityManager#createQuery.Затем установите параметры: firstResult и maxResults:

    query.setFirstResult(10).setMaxResults(20);
    

    Это займет 20 объектов, начиная с 10-го.

0 голосов
/ 23 февраля 2019

С EntityManager вы можете использовать Query объекты.Он предоставляет вам несколько различных методов для создания ваших запросов, которые вы можете увидеть в Документах .

Оттуда вы можете использовать Query для выбора или выполнения обновления.в базу данных.

Обновить пример:

//:id is a parameter you can set
Query query = entityManager.createQuery("delete from Entity e where e.id = :id");
query = query.setParameter("id", id);
query.executeUpdate();

Выбрать пример (используя TypedQuery, который реализует Query:

String sql = "select e from Entity e";
TypedQuery<Entity> query = entityManager.createQuery(sql, Entity.class);
System.out.println(query.getResultList());

Вы можете определить предел и смещениекак это:

query = query.setFirstResult(offset);
query = query.setMaxResults(limit);

Если у вас есть сущность под рукой, вы можете (и должны) удалить ее, используя EntityManager с remove(). Вы получаете эту ошибку, потому чтоваша сущность отсоединена, то есть ваша EntityManager не знает о ее существовании.

Чтобы "прикрепить" сущности к своему менеджеру, вы можете использовать merge(). Однако, если указанная сущность не существуетв базу данных он будет вставлен, и если он существует, но имеет поля, отличные от вашего объекта, он будет обновлен.

public void delete(Cat cat) {
    if(!entityManager.contains(cat)) {
        entityManager.merge(cat);
    }

    entityManager.remove(cat);
}

Для вставки объектов в первый раз вы также можете использовать persist().различия между merge() и persist(), см. this .

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