JPA使用存储库findBy和实体对象

68bkxrlz  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(97)

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

到目前为止我做了什么:

我有两个类,Person.javaHouse.java,这两个类之间有一个OneToOne关系。我想创建一个搜索函数,它允许我根据House属性查找Person。为了找到所有拥有zipcode为“45000”和城市为“ORLEANS”的房屋的人。为此,我在我的存储库findByHouseZipcodeAndCity中声明了一个函数。
现在,问题是我的House实体有大约15个属性,我想对这15个属性中的任何一个进行研究:仅邮政编码,邮政编码和城市,城市和表面......这会产生很多组合,我不想为每个组合创建findBy方法。
我尝试给予一个包含搜索条件的House对象作为findBy的参数。这不起作用,因为Hibernate抛出了以下错误:object references an unsaved transient instance - save the transient instance before flushing。问题是我创建了一个House的示例,我用我的搜索条件填充它,我用它来搜索我的findBy,但是我发现findBy生成了一个flush(),而房子实体没有保存(我不希望它被保存,因为它只是一个搜索)。
我已经找到了一些解决方案,比如使用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);
}

字符串

Person.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;

}

House.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...
}

mctunoxg

mctunoxg1#

您可以使用query by example,这是一种用户友好的查询技术,允许动态创建查询,根本不需要编写查询。
考虑以下实体:

@Data
@Entity
public class Person {

    @Id
    private String id;
    private String firstname;
    private String lastname;
    private Address address;
}

字符串
要搜索具有给定姓名的所有人员,您可以使用:用途:

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

Example<Person> example = Example.of(person);
Iterable<Person> searchResult = repository.findAll(example);


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

Person searchResult = repository.findOne(example);

相关问题