【问题标题】:How to handle multiple fields in JPA Repository query methods?如何处理 JPA Repository 查询方法中的多个字段?
【发布时间】:2020-01-01 12:17:32
【问题描述】:

我有 Person - 一个 JPA 实体,它有几个 @OneToOne 映射到其他一些实体,如地址、房屋和汽车。我想在一个查询中找到拥有特定房屋和特定汽​​车的人。

例如,如果我们想通过 id 来查找 Person,我们可以使用 findById 方法。如果我们想使用名称查找,我可以在我的存储库中定义一个findByName 方法。

我的问题是:如果我想选择一个设置了 2 个以上字段的人,方法签名是什么?

我已尝试通过仅使用一个属性的方法findByHouse() 选择使用 House。我想使用多个属性进行选择。

人物类:

@Entity(name="Person")
@Table(name="person")
@Data
class Person{

@Column(name="HouseID")
Integer houseID;

@Column(name="CarID")
Integer carID;

@Column(name="AddressID")
Integer addressID;

@OneToOne ( fetch= FetchType.EAGER, cascade = CascadeType.ALL )
@JoinColumn ( name = "houseID" )
private House house;

@OneToOne ( fetch= FetchType.EAGER, cascade = CascadeType.ALL )
@JoinColumn ( name = "carID" )
private Car car;

@OneToOne ( fetch= FetchType.EAGER, cascade = CascadeType.ALL )
@JoinColumn ( name = "addressID" )
private Address address;

}

现在是存储库:

public interface PersonRepository extends JpaRepository<Person,Long>{

   @Query("select p from Person p where p.house.id=:id")
   Person findByHouse(@Param("id")Integer houseID);
}

我希望有一个 Person 记录,其中房屋、汽车和地址设置为在查询中传递的特定值。

【问题讨论】:

    标签: java spring spring-boot jpa


    【解决方案1】:

    只需传递多个参数并使用and 扩展您的查询即可满足多种需求。

    public interface PersonRepository extends JpaRepository<Person,Long>{
    
       @Query("select p from Person p where p.house.id=:houseId and p.carID =:carId")
       Person findByHouseAndCar(@Param("houseId")Integer houseID, @Param("carId")Integer carID);
    }
    

    【讨论】:

    • 如果我有超过 10 个这样的字段怎么办?方法名称也需要那么长或者可以更短?
    • 当您指定参数和显式查询时,您可以随意命名该方法。
    猜你喜欢
    • 1970-01-01
    • 2013-03-21
    • 2018-01-09
    • 2015-01-12
    • 1970-01-01
    • 2017-09-17
    • 2011-10-01
    • 1970-01-01
    • 2012-12-29
    相关资源
    最近更新 更多