#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.