Объединение Spring Data Jpa с несколькими таблицами без @Query

#java #spring #spring-boot #jpa

#java #spring #весенняя загрузка #jpa

Вопрос:

Я новичок в Spring boot, особенно для Spring Boot Data JPA

Я хочу написать метод JPA без @Query

Я знаю, как выбирать с помощью @Query, однако, в методе JPA с чистыми данными не так много, как

Целочисленный поиск уровня между значениями Methomething и methomething2 (целочисленный идентификатор пользователя);

  @Entity
 @Table(name = "point")
 public class Point {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "point_id", nullable = false)
private Integer pointId;

@Column(name = "user_id", nullable = false)
private Integer userId;

@Column(name = "point", nullable = false)
private Integer point;

@Column(name = "user_account_point_type_id", nullable = false)
private Integer pointTypeId;

@Column(name = "date_created", nullable = false)
private Date createdDate;
  

Это точечный объект, который хранит точку

и объект уровня

  @Entity

 @Table(name = "level", schema = "public")
  public class Level {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "level_id", nullable = false)
private Integer levelId;

@Column(name = "user_id", nullable = false)
private Integer userId;

@Column(name = "level_type_id", nullable = false)
@JoinColumn(name ="level_type_id")
private Integer levelTypeId;


@Column(name = "reg_date", nullable = false)
private Date regDate;
  

и тип уровня состоит из 4 типов (1-бронзовый / 2-серебряный / 3-золотой / 4-платиновый)
тип i уровня проверяется при сохранении точки

и это запрос, который я делаю

выберите ult.level_type_id из level_type ult, где (выберите sum(up.point) из level ull, укажите up, level_type ult, где ull.level_type_id=ult.level_type_id и ull.user_id=up.user_id и up.user_id= 73) между ult.level_start_point И ult.level_end_point

результатом является level_type в виде целого числа

этот запрос я хочу сделать как JPA @Query() X!!!

ВОТ ТАК @Repository

  public interface LevelTypeRepository extends 
JpaRepository<LevelType,Integer> {

Integer findByLevelPointMaxBetweenLevelPointMinAndLevelPointMax(Integer 
userId);
  

}

Однако он не работает и не знает, как объединить три таблицы с одним параметром, кроме того, параметр (user_id) между level_start_point и level_end_point

Сложно ли выразить через JPA?

Ответ №1:

Да, это невозможно без @Query.

вы должны выбрать либо JPA QL, либо HQL.

Вместо прямой таблицы базы данных он использует Java entity class, которые сопоставляются с таблицами базы данных.

вы используете имя таблицы в своем запросе, что неверно.

Используйте имя класса объекта вместо имени таблицы и используйте значение свойства объекта вместо имени столбца таблицы.

Например

 @Query("SELECT l.levelId FROM Level l where l.userId = :uid")
  

Ответ №2:

Имеет ли база данных это отношение объединения, т. Е. Существует ли отношение foreign_key Primary_Key в DB между таблицами? Если да, вы можете сделать это без использования аннотации @Query. В противном случае JPA не будет присоединяться к таблице сам по себе, поэтому требуется пользовательский запрос и становится необходимым тег @Query.