Java 如何通过crudepository中的嵌入对象进行搜索?
假设我有一个可嵌入类,它嵌入在一个实体类中,如下所示Java 如何通过crudepository中的嵌入对象进行搜索?,java,spring,hibernate,jpa,spring-data-jpa,Java,Spring,Hibernate,Jpa,Spring Data Jpa,假设我有一个可嵌入类,它嵌入在一个实体类中,如下所示 @Embeddable public class FullName { private String firstName; private String lastName; // constructor, getters, setters, as needed } @Entity public class Account { @Embedded private FullName fullName;
@Embeddable
public class FullName {
private String firstName;
private String lastName;
// constructor, getters, setters, as needed
}
@Entity
public class Account {
@Embedded
private FullName fullName;
// id, other data and methods
}
一个人可以有多个帐户,因此全名不是Account类的键。我想要的是jpa存储库中的以下方法
public interface AccountRepository extends CrudRepository<Account, Long> {
Collection<Account> findAllByFullName(FullName fullName);
}
公共接口AccountRepository扩展了Crudepository{
集合findAllByFullName(FullName FullName);
}
起初,我以为这会奏效,但显然不是那么简单。我找不到这样的方法来工作。我认为唯一有帮助的是,在FullName上实现一个equals方法,表示具有相同名字和姓氏的FullName是相等的,但这没有效果
我现在要做的是:
public interface AccountRepository extends CrudRepository<Account, Long> {
Collection<Account> findAllByFullNameFirstNameAndFullNameLastName(String firstName, String lastName);
default Collection<Account> findAllByFullName(FullName fullName) {
return findAllByFullNameFirstNameAndFullNameLastName(fullName.getFirstName(), fullName.getLastName());
}
}
公共接口AccountRepository扩展了Crudepository{
集合FindAllByFullNameFirstName和FullNameLastName(字符串firstName,字符串lastName);
默认集合findAllByFullName(FullName FullName){
返回FindAllByFullNameFirstName和FullNameLastName(fullName.getFirstName(),fullName.getLastName());
}
}
我有没有办法避免创建此中间(可见)方法?您可以使用以下方法:
Collection<Account> findAll(Example< Account > account);
Collection findAll(示例Account);
然后作为
FullName fullName = new FullName(fname, lname);
Account acc = new Account();
acc.setFullName(fullName);
Collection<Account> accounts = accountRepository.findAll(Example.of(acc));
FullName FullName=新的全名(fname,lname);
账户acc=新账户();
acc.setFullName(全名);
Collection accounts=accountRepository.findAll(例如,of(acc));
希望能有所帮助。这已经是向前迈出的一大步!在我的实际应用程序中,嵌入对象有三个字段,我有一个实体有两个这样的嵌入字段。这意味着存储库中的方法有多达6个参数,并且名称太长,无法在我的IDE中显示。我一定会尝试使用这个方法来避免6个参数的怪兽。@ErikRijcken请投票并接受答案,如果它对你有帮助的话。我尝试过这个方法,但遗憾的是它没有完全达到我想要的效果。例如,如果我有一个只有姓的全名和一个空的名字,它只会忽略名字,而不是搜索一个名为空和给定姓氏的帐户。我需要能够支持这两种情况您可以使用
ExampleMatcher matcher=ExampleMatcher.matching().withIncludeNullValues()代码>和示例(acc、matcher)。我没有尝试过,但它应该可以工作。但是在这种情况下,它是否也会查找Account类中其他字段的null值的精确匹配(例如)呢?请记住,在一天结束时,它是一个执行的SQL查询。您的RDBMS不可能使用您提供的Javaequals
方法