JPA 将存储库 findBy 与实体对象结合使用

sap*_*tte 5 java hibernate jpa spring-boot

我正在尝试创建一个 Spring Boot 应用程序,并且我想设置一个研究功能。

到目前为止我所做的:

我有两个类,Person.javaHouse.java,OneToOne这两个类之间存在关系。我想创建一个研究功能,让我可以根据房屋属性找到一个人。例如,查找拥有邮政编码“45000”和城市“ORLEANS”房屋的所有人员。为此,我在我的存储库中声明了一个函数findByHouseZipcodeAndCity

现在,问题是我的 House 实体有大约 15 个属性,我想对这 15 个属性中的任何一个进行研究:仅邮政编码、邮政编码和城市、城市和表面...这会产生很多组合,但我不知道不想findBy为每个组合创建方法。

findBy我尝试将包含搜索条件的 House 对象作为参数提供。这不起作用,因为休眠会向我抛出此错误:object references an unsaved transient instance - save the transient instance before flushing。问题是我正在创建一个 House 的实例,我用我的搜索条件填充它,并将它用于我的 findBy,但我发现 findBy 生成了一个 ,flush()而 House 实体没有保存(而且我不保存)不希望保存它,因为它仅用于搜索)。

我找到了诸如使用 JPA Criterias 之类的解决方案,但我想知道是否可以仅通过使用实体作为 findBy 方法的参数来执行搜索。

预先感谢您的帮助

PersonRepository.java

@Repository
public interface PersonRepository extends JpaRepository<Person, Long>{
    List<Person> findByHouseZipcodeAndHouseCity(String zipcode, String city);
    List<Person> findByHouse(House house);
}
Run Code Online (Sandbox Code Playgroud)

人.java

@Entity
public class Person{

    @Id
    @SequenceGenerator(name = "INFO_ACTION_SEQ", sequenceName = "INFO_ACTION_SEQ")
    @GeneratedValue(generator = "INFO_ACTION_SEQ", strategy = GenerationType.AUTO)
    @Column(name = "ID_PERSON", columnDefinition = "INTEGER")
    private Integer id;

    private String name;

    private String surname;

    @OneToOne(cascade = CascadeType.ALL)
    private House house;

}
Run Code Online (Sandbox Code Playgroud)

房子.java

@Entity
public class House{

    @Id
    @SequenceGenerator(name = "INFO_ACTION_SEQ", sequenceName = "INFO_ACTION_SEQ")
    @GeneratedValue(generator = "INFO_ACTION_SEQ", strategy = GenerationType.AUTO)
    @Column(name = "ID_HOUSE", columnDefinition = "INTEGER")

    private Integer id;

    private String city;
    private String street:
    private String zipcode;
    private String country;
    // Other properties...
}
Run Code Online (Sandbox Code Playgroud)

cas*_*lin 5

您可以使用示例查询,这是一种用户友好的查询技术,允许动态创建查询,并且根本不需要您编写查询。

考虑以下实体:

@Data
@Entity
public class Person {

    @Id
    private String id;
    private String firstname;
    private String lastname;
    private Address address;
}
Run Code Online (Sandbox Code Playgroud)

要搜索具有给定名称的所有人员,您可以使用:

@Data
@Entity
public class Person {

    @Id
    private String id;
    private String firstname;
    private String lastname;
    private Address address;
}
Run Code Online (Sandbox Code Playgroud)

而且,如果您需要搜索一个人,请使用:

Person person = new Person();
person.setFirstname("Dave");

Example<Person> example = Example.of(person);
Iterable<Person> searchResult = repository.findAll(example);
Run Code Online (Sandbox Code Playgroud)