Spring Data Jpa Join使用多个表而不使用@Query

时间:2019-04-05 06:52:07

标签: java spring spring-boot jpa

我是Spring Boot的新手,尤其是Spring Boot Data JPA

我想编写不带@Query的JPA方法

我知道如何通过@Query选择 但是,关于纯数据JPA方法没有太多内容 像

  

整数findByLevelPointBetweenSomethingAndSomething2(整数userId);

 @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-铂) 存储点时会检查我的关卡类型

这是我所做的查询

从level_type ult中选择ult.level_type_id,其中(选择sum(up.point) 从级别ull,向上指向,级别类型ult 其中ult.level_start_point和ult.level_end_point之间的ull.level_type_id = ult.level_type_id和ull.user_id = up.user_id和up.user_id = 73)

结果是级别类型,为整数形式

我想作为JPA进行此查询 @Query()X !!!

喜欢这个     @存储库

 public interface LevelTypeRepository extends 
JpaRepository<LevelType,Integer> {

Integer findByLevelPointMaxBetweenLevelPointMinAndLevelPointMax(Integer 
userId);

}

但是它不起作用并且不知道如何通过具有一个参数的三个表进行联接 此外,在level_start_point和level_end_point之间的参数(user_id)

通过JPA表示很难吗?

2 个答案:

答案 0 :(得分:0)

数据库是否具有这种联接关系,即表之间的DB中是否存在Foreign_key Primary_Key关系?如果是,则无需使用@Query批注即可。如果不是这样,JPA将不会单独连接表,因此需要自定义查询,并且必须使用@Query标记。

答案 1 :(得分:0)

是的,没有@Query是不可能的。

您必须参加JPA QL或HQL。

代替直接数据库表,它使用与数据库表映射的Java实体类。

您在查询中使用表名,这是错误的。

使用Entity类名代替表名,并使用实体属性的值代替表的列名。

例如

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