haHAA

Пользователь

Регистрация: 25.03.2017

Сообщения: 1205

Рейтинг: 777

haHAA

Регистрация: 25.03.2017

Сообщения: 1205

Рейтинг: 777

img

Короче, есть довольно простой курсач, но появились сомнения в затраченных ресурсах на сервис.

Не будем особо вдаваться в детали всех энтитис, рассмотрим на примере энтитис Person и Group.


Person имеет внешний ключ, указывающий на Group (к какой группе относится студент). И простой запрос для удаления всех студентов, относящихся к одной группе выглядит так:


Берем всех людей, берем все группы, соотносим, удаляем нужных. По ощущениям делаю чет неправильно, потому что в реальных задачах БД может быть огромной и перебор всех элементов будет излишен.

Где-то увидел, что нужно использовать DTO (data transfer object). Это то, что решит проблему производительности или нужно куда-то в другую сторону смотреть?


UPD: понял, что чуток неправильный код привел, ну представьте, что там где-то в методе используется service для другой entitty и много работы тратим на перебор двух таблиц.

pochemyzamenya

Пользователь

Регистрация: 25.02.2016

Сообщения: 4457

Рейтинг: 4064

pochemyzamenya

Регистрация: 25.02.2016

Сообщения: 4457

Рейтинг: 4064

Зашел на пастбин превратился в pigpole.png?1642434806pepejeez.png?1592046683

А в чем проблема то?

Я так понимаю что тебе нужен дефолтный запрос

дто упрощает сериализацию и добавит тебе еще одну таблицу

zxczxc

Пользователь

Регистрация: 05.08.2012

Сообщения: 476

Рейтинг: 192

zxczxc

Регистрация: 05.08.2012

Сообщения: 476

Рейтинг: 192

дто предназначено для упрощения работы модели с базой, это все.

у тебя на вид вобще какая то каша в 1 методе

tDmn///

Пользователь

Регистрация: 31.07.2012

Сообщения: 830

Рейтинг: 138

tDmn///

Регистрация: 31.07.2012

Сообщения: 830

Рейтинг: 138

А ты не думал в другую сторону сделать связь? Не от людей к группам, а от групп к людям?

IKYouRBad

Пользователь

Регистрация: 08.03.2022

Сообщения: 111

Рейтинг: -9

Нарушения: 1000

IKYouRBad

Регистрация: 08.03.2022

Сообщения: 111

Рейтинг: -9

Нарушения: 1000

Чет кринж, ты хрень делаешь, такая задача решается так:

DELETE FROM people p WHERE p.group_id = ?

PepeCringe.png?1598477741



DTO это просто штука, которая архитектурно защищает базу от внешних действий с данными.

Armagedonby_ZERGS

Пользователь

Регистрация: 23.03.2015

Сообщения: 11361

Рейтинг: 4428

Armagedonby_ZERGS

Регистрация: 23.03.2015

Сообщения: 11361

Рейтинг: 4428

Как указали выше, тебе не нужно в джаве вообще ничего делать. Просто напиши запрос в БД, кинь в этот запрос ключ группы как аргумент = профит.

morecore

Пользователь

Регистрация: 19.07.2013

Сообщения: 1350

Рейтинг: 372

morecore

Регистрация: 19.07.2013

Сообщения: 1350

Рейтинг: 372

мде найс советики тут)
у драйвера твоей бд 99% есть метод deleteBy, его и юзай

Noonecan

Пользователь

Регистрация: 14.03.2014

Сообщения: 1248

Рейтинг: 344

Noonecan

Регистрация: 14.03.2014

Сообщения: 1248

Рейтинг: 344

haHAA сказал(а):
Нажмите, чтобы раскрыть...

Выложи остатки, у тебя пока непонятно как Entity сформированы и что ты вообще используешь.


Твою задачу можно решить следующими путями
1. Сделать сущность Group, в ней описать поля Group, что то в духе

import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.*;
import lombok.*;
import lombok.extern.slf4j.Slf4j;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Slf4j
@Getter
@Builder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@ToString(doNotUseGetters = true)
@Entity
@Table(name = "GROUP")
public class Group {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

@EqualsAndHashCode.Exclude

private Long id;


@Column(name = "TIME_STAMP", nullable = false)

@EqualsAndHashCode.Exclude

private Date timeStamp;


@Column(name = "NAME", nullable = false)

private String name;



@OneToMany(cascade = {CascadeType.MERGE,






CascadeType.PERSIST}, fetch = FetchType.LAZY, mappedBy = "group", orphanRemoval = true)

@Fetch(value = FetchMode.SUBSELECT)

@Builder.Default

@EqualsAndHashCode.Exclude

@ToString.Exclude

private final Set persons = new HashSet<>();

}


2. Сделать Person
@Slf4j
@Getter
@Builder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@ToString(doNotUseGetters = true)
@Entity
@Table(name = "PERSON")
public class Person {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

@EqualsAndHashCode.Exclude

private Long id;


@Column(name = "TIME_STAMP", nullable = false)

@EqualsAndHashCode.Exclude

private Date timeStamp;


@Column(name = "NAME", nullable = false)

private String name;


@ManyToOne(fetch = FetchType.LAZY)

@JoinColumn(name = "GROUP_ID", nullable = false)

@EqualsAndHashCode.Exclude

@ToString.Exclude

private Group group;

}


3. Обрати внимание на связь @OneToMany и @ManyToOne - это одна и та же связь, которая говориТ, что у одной группы может быть много персон, а у одной персоны при этом может быть только одна группа-родитель

4. Теперь тебе осталось сделать репоз и переопределить метод удаления всех персон, у которых родитель - вот такая то группа
import Group;
import Person;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface PersonRepository extends CrudRepository {



void deleteAllByGroup(Group g);
}

5. Найди jpa объект группы (с помощью чего хочешь) и вызови personRepository.deleteAllByGroup(g)

6. Вы великолепны.