У меня есть 3 класса, с которыми я хочу взаимодействовать в репозитории JPA:
- Goal - словарь для целей пользователя. Связано с «Единицей» класса как Много (цель) к Одному (Единица). Таким образом, каждая Цель может быть связана только с одним Единицей .
- Роль - содержит права пользователя в Системе. Связан с Юнитом класса так же, как Цель . Таким образом, у каждой роли может быть только один юнит.
- юнит - содержит подразделение. Используется в качестве словаря двумя вышеупомянутыми классами.
Цель поддерживается на основе 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);
}