Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过crudepository中的嵌入对象进行搜索?_Java_Spring_Hibernate_Jpa_Spring Data Jpa - Fatal编程技术网

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不可能使用您提供的Java
equals
方法