запрос spring JPA для поиска событий по идентификатору местоположения и идентификатору категории

#spring #spring-boot #spring-data-jpa

Вопрос:

Это моя сущность событий.

 @Data @AllArgsConstructor @NoArgsConstructor @Entity public class Events {   @Id  @GeneratedValue(strategy = GenerationType.AUTO)  private Long eventId;    @NotBlank(message = "Please Add Event name ")  @Length(max =100 ,min =2)  private String eventName ;     private String eventDescription;   // Each event is going to be mapped to a Location  @OneToOne(cascade = CascadeType.ALL)  @JoinColumn(  name = "location_id",  referencedColumnName = "locationId"  )  @NotNull  private Location location ;    @Temporal(TemporalType.DATE)  Date eventStartDate;   @Temporal(TemporalType.DATE)  Date eventEndDate;      @OneToOne(cascade = CascadeType.ALL)  @JoinColumn(  name = "category_id",  referencedColumnName = "categoryId"  )  @NotNull  private Categories categories;   }  

В моем контроллере у меня есть доступ к идентификатору местоположения и идентификатору категории в качестве параметров запроса . Я не понимаю, как определить мои события для доступа по идентификатору местоположения и идентификатору категории. Какие изменения я должен внести в это репо, чтобы все работало .

 @Repository public interface EventsRepository extends JpaRepositorylt;Events,Longgt; {  public Events findByCateoryAndLocation() }  

Комментарии:

1. findByCategoryIdAndLocationId(long id, long id) . Что-то в этом роде в зависимости от названия @Id поля в Category и Location .

Ответ №1:

Я думаю, что вам нужно внести несколько изменений, чтобы избавиться от этой проблемы. Построитель запросов использует фактические имена столбцов, поэтому, если ваше имя столбца-LocationID, используйте » findByLocationId(целочисленный идентификатор местоположения)» в качестве прототипа. И, пожалуйста, убедитесь, что имена сущностей соответствуют именам таблиц.

 @Repository public interface EventRepository extends JpaRepositorylt;Event, Integergt; {  Event findByLocationIdAndCategoryId(Integer locationId, Integer categoryId); }  

Это не по теме, но я хотел бы отметить, что, пожалуйста, не используйте Ломбок в классах сущностей. Генераторы геттера, сеттера и построения-это нормально, но генераторы кода и строк могут быть опасны, если вы используете ленивую инициализацию. Возможно, вы не получите пользы от ленивых нагрузок.

Ответ №2:

У вас есть 2 способа заставить ваш jpa-запрос работать:

  1. Измените свой JPA-запрос:

    @Репозиторий

 public interface EventsRepository extends JpaRepositorylt;Events,Longgt;  {  public Events findByCateories_IdAndLocation_id(Long categoriesId, long locationId) }  
  1. Используйте пользовательский запрос — аннотируйте свой jpa с помощью @Query и используйте собственный запрос

С моей стороны есть еще один момент. Названия ваших классов. Вы используете множественное число, которое противоречит бизнес — логике, особенно отношениям к базе данных(см. раздел «События в категориях»). Я бы использовал единственное число (Событие, Категория).

Ответ №3:

Это именно то, что я сделал, чтобы решить эту проблему с помощью собственного запроса.

 @Query(  value = "SELECT * FROM events where category_id = ?1 AND location_id = ?2",  nativeQuery = true  )  public Listlt;Eventsgt; findByCategoryIdAndLocationIdIn(Long CategoryId , Long LocationId);