Ошибка передачи коллекции в репозиторий JPA - PullRequest
0 голосов
/ 19 марта 2020

У меня есть 3 класса, с которыми я хочу взаимодействовать в репозитории JPA:

  1. Goal - словарь для целей пользователя. Связано с «Единицей» класса как Много (цель) к Одному (Единица). Таким образом, каждая Цель может быть связана только с одним Единицей .
  2. Роль - содержит права пользователя в Системе. Связан с Юнитом класса так же, как Цель . Таким образом, у каждой роли может быть только один юнит.
  3. юнит - содержит подразделение. Используется в качестве словаря двумя вышеупомянутыми классами.

Цель поддерживается на основе GoalReposotory и GoalServiceImpl , который является моим основным интерфейсом для CRUD.

Проблема: Я хочу передать коллекцию объектов Role в хранилище ( GoalServiceImpl ), чтобы получить набор "Goals", который имеет тот же Единица с, как набор Роль с. Поэтому я могу отфильтровать список целей, просто передав параметр Role.

Я добавляю это в мой CrudRepostitory Iterable<Goal> getGoalsByUnits (List<Unit> unit); и получаю сообщение об ошибке:

 “Caused by: java.lang.IllegalArgumentException: Failed to create query for method public abstract java.lang.Iterable com.platform.repository.GoalRepository.getGoalsByUnits(java.util.Set)! No property units found for type Goal! Did you mean 'unit'?”

Что я делаю неправильно? Возможно, это потому, что у меня есть только один Юнит на каждый Цель объект? Как лучше всего решить мою задачу?

Класс цели

public class Goal {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "ID", nullable = false)
   private Long id;

   @Column(name = "DESCR", length = 255, nullable = false)
   public String descr;

   @ManyToOne
   @JoinColumn (name="UNIT_ID", nullable = false)
   public Unit unit; //UNIT IS HERE!

   @Column(name = "VL")
   private float vl;

Класс юнита

@Entity
@Table(name="UNITS", schema="MAPP")
public class Unit {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", nullable = false)
    private Long id;

    @Column(name = "UNITNAME")
    private String unitname;

    @OneToMany(mappedBy = "unit")
    Set<Role> role;

Класс роли


@Entity
@Table(name="ROLES", schema="MAPP")
public class Role implements GrantedAuthority {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", nullable = false)
    private Long id;

    @Column(name = "ROLENAME")
    private String rolename;

    @Column(name = "FULLNAME")
    private String fullname;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "UNIT_ID")
    private Unit unit;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "PERMISSION_ID")
    private Permission permission;

Хранилище целей

public interface GoalRepository extends CrudRepository<Goal, Long> {

    Iterable<Goal> getGoalsByUnit (Unit unit);
    Iterable<Goal> getGoalsByUnits (List<Unit> unit);
}

Интерфейс репозитория целей

public class GoalServiceImpl implements GoalService {

public Iterable<Goal> getByRoles (Set<Role> roles) {
    List<Unit> units = new ArrayList<>();
    roles.forEach(e -> {
            units.add(e.getUnit());
    });
    return rep.getGoalsByUnits(units);
}

1 Ответ

0 голосов
/ 20 марта 2020

Sprint Data JPA предоставляет многочисленные соглашения об именах для методов хранилища, которые помогают нам определить способ получения данных из БД без необходимости писать запросы.

В вашем случае вы хотел использовать предложение in, которое не может быть достигнуто с множественным числом, поэтому ваш метод должен называться getGoalsByUnitIn.

...