Задать вопрос
DennisKingsman
@DennisKingsman
Студент

Почему не получается добавить метод в interface, наследующийся от JpsRepo?

Здравствуйте, я пытаюсь добавить некоторую логику в интерфейс для управления сущностями
логика была такова , что сначала юзер регестрируется, потом на личной странице он имеет возможность добавить коробку и видеть все свои коробки(изначально у него их нет)
так же он имеет возможность редактировать или удалить коробку , при редактировании коробки он имеет возможность изменить ее параметры или добавить туда датчиков или растений (изначально их там нет)
у меня был User у которого есть роли(в моем случае только одна), и по идее должны быть коробки
@Entity
@Table(name = "usr")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;

    private String password;

    private String email;

    private boolean active;

    @ElementCollection(targetClass = Role.class, fetch = FetchType.EAGER)
    @CollectionTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"))
    @Enumerated(EnumType.STRING)
    private Set<Role> roles;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "responsibleUser", cascade = CascadeType.ALL)
    private List<GrowBox> growBoxes;

    public User() {
    }
// getters, setters 
}


есть сами коробки , у которых есть несколько (или не несколько) растений и датчиков
@Entity
@Table(name = "growBoxes")
public class GrowBox {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long id;

    private Integer length;

    private Integer width;

    private Integer height;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "responsibleGrowBox", cascade = CascadeType.ALL)
    private List<Plant> plants;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "activeGrowBox", cascade = CascadeType.ALL)
    private List<Sensor> sensors;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User responsibleUser;

    public GrowBox() {
    }
// Getters, setters 
}


собстна есть сами растения и датчики
@Entity
@Table(name = "plants")
public class Plant {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String plantName;

    private Integer num;

    private String status;

    @ManyToOne
    @JoinColumn(name = "gb_id")
    private GrowBox responsibleGrowBox;

    public Plant() {
    }
//... 
}


@Entity
@Table(name = "sensors")
public class Sensor {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String sensorName;

    private Integer value;

    @ManyToOne
    @JoinColumn(name = "agb_id")
    private GrowBox activeGrowBox;

    public Sensor() {
    }
//....
}

после я создаю repo интерфейс наследуя его от JpaRepo
и все работает нормально таблицы создаются (сам UI я пока не делал под коробки )
так же у меня был Юзер репо в который я накидал методов своих для того чтобы искать пользователя при попытке регистрации по мылу и имени и в случае чего говорить что такой пользователь есть
public interface UserRepo extends JpaRepository<User, Long> {

    User findByUsername(String username);

    User findByEmail(String email);
}

и на этом этапе все нормально ( UI под регистрацию и аутентификацию есть )
после я решил добавить в Репо для коробок метод который бы позволил мне найти коробку по ID юзера (или можно по имени) ведь поле userId это поидее поле по которому мапятся коробки к юзеру (указано в анатации)
public interface GrowBoxRepo extends JpaRepository<GrowBox, Long> {
     List<GrowBox> findByUserId(Long userId);
}

и тут уже все это дело падает мол нет проперти в гровбоксе для ЮзерАйди

вот стактрейс
Error creating bean with name 'requestMappingHandlerAdapter' defined in class path resource
Error creating bean with name 'mvcConversionService' defined in class path resource
Error creating bean with name 'growBoxRepo': Invocation of init method failed; nested exception ....
Failed to create query for method public abstract java.util.List com.example.auth.repo.GrowBoxRepo.findByUserId(java.lang.Long)! No property userId found for type GrowBox!
Caused by: org.springframework.data.mapping.PropertyReferenceException: No property userId found for type GrowBox!

с одной стороны это потому что нет поля Юзерайди в коробке , но с другой стороны оно же там есть , объявлено в анатации и если создать еще поле с таким именем , то он выдаст мол есть 2 одинаковых поля в sql таблице или чет такое
заранее спасибо
  • Вопрос задан
  • 817 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@sviato_slav
findByResponsibleUserId
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
List<GrowBox> findByUserId(Long userId);
первое, что попадатся на глаза - вы хотите получить List. Если мне память не изменяет, то надо использовать
List<GrowBox> findAllByUserUserId(Long userId) если мне память не изменяет, то должно быть как-то так
а то получается, что вы хотите получаете один объект по userId, но при этом хотите получить List

либо вы можете сделать следующее:
List<GrowBox> findAllByUser(User user);
в таком случае в метод нужно передать пользователя, а не его id.

Кстати, обычно, IDE подсказывает как должно быть...

No property userId found for type GrowBox!
Caused by: org.springframework.data.mapping.PropertyReferenceException: No property userId found for type GrowBox!

вы как бы получаете доступ к объекту User, а потом userId. А по вашему методу получается, что в таблице growBoxes вы ищете userId
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы