#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-запрос работать:
- Измените свой JPA-запрос:
@Репозиторий
public interface EventsRepository extends JpaRepositorylt;Events,Longgt; { public Events findByCateories_IdAndLocation_id(Long categoriesId, long locationId) }
- Используйте пользовательский запрос — аннотируйте свой 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);