sap*_*tte 5 java hibernate jpa spring-boot
我正在尝试创建一个 Spring Boot 应用程序,并且我想设置一个研究功能。
到目前为止我所做的:
我有两个类,Person.java和House.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)
您可以使用示例查询,这是一种用户友好的查询技术,允许动态创建查询,并且根本不需要您编写查询。
考虑以下实体:
@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)
| 归档时间: |
|
| 查看次数: |
6751 次 |
| 最近记录: |