Java 元组列表的Crudepository findBy方法签名

Java 元组列表的Crudepository findBy方法签名,java,spring,collections,tuples,spring-data-jpa,Java,Spring,Collections,Tuples,Spring Data Jpa,我有这样一个实体类: @Entity @Table(name = "CUSTOMER") class Customer{ @Id @Column(name = "Id") Long id; @Column(name = "EMAIL_ID") String emailId; @Column(name = "MOBILE") String mobile; } 如何使用CRUDepository spring数据jpa为下面的查询编写find

我有这样一个实体类:

@Entity
@Table(name = "CUSTOMER")
class Customer{
    @Id
    @Column(name = "Id")
    Long id;
    @Column(name = "EMAIL_ID")
    String emailId;
    @Column(name = "MOBILE")
    String mobile;
}
如何使用CRUDepository spring数据jpa为下面的查询编写findBy方法

select * from customer where (email, mobile) IN (("a@b.c","8971"), ("e@f.g", "8888"))
我期待着像这样的事情

List<Customer> findByEmailMobileIn(List<Tuple> tuples);
List findByEmailMobileIn(列表元组);

我想从给定的对中获取客户列表

我想这可以通过
org.springframework.data.jpa.domain.Specification
实现。您可以传递一个元组列表,并以这种方式进行操作(不要在意元组不是实体,但您需要定义此类):

公共类CustomerSpecification实现了该规范{
//客户实体中字段的名称
私有静态最终字符串CONST\u EMAIL\u ID=“emailId”;
私有静态最终字符串CONST_MOBILE=“MOBILE”;
私有列表元组;
公共索赔规范(列表元组){
this.tuples=元组;
}
@凌驾
公共谓词toPredicate(根根、CriteriaQuery查询、CriteriaBuilder cb){
//将与逻辑OR连接
列表谓词=新的ArrayList();
tuple.forEach(tuple->{
List innerPredicates=new ArrayList();
if(tuple.getEmail()!=null){
innerPredicates.add(cb.equal(root
.get(CONST_EMAIL_ID),tuple.getEmail();
}
if(tuple.getMobile()!=null){
innerPredicates.add(cb.equal(root
.get(CONST_MOBILE),tuple.getMobile());
}
//这些谓词匹配一个元组,因此与AND连接
add(andTogether(innerPredicates,cb));
});
返回或一起返回(谓词,cb);
}
私有谓词或其他谓词(列表谓词、CriteriaBuilder cb){
返回cb.or(谓词toArray(新谓词[0]);
}
私有谓词ANDTOHE(列表谓词、CriteriaBuilder cb){
返回cb.and(谓词toArray(新谓词[0]);
}
}
您的回购应该扩展接口
JpaSpecificationExecutor


然后用元组列表构造一个规范,并将其传递给方法
customerRepo.findAll(规范)
-它返回一个客户列表。

使用投影可能更干净:

@Entity
@Table(name = "CUSTOMER")
class CustomerQueryData {
    @Id
    @Column(name = "Id")
    Long id;
    @OneToOne
    @JoinColumns(@JoinColumn(name = "emailId"), @JoinColumn(name = "mobile"))
    Contact contact;
}
联系实体:

@Entity
@Table(name = "CUSTOMER")
class Contact{
    @Column(name = "EMAIL_ID")
    String emailId;
    @Column(name = "MOBILE")
    String mobile;
}
指定实体后,回购协议:

CustomerJpaProjection extends Repository<CustomerQueryData, Long>, QueryDslPredicateExecutor<CustomerQueryData> {
    @Override
    List<CustomerQueryData> findAll(Predicate predicate);
 }
customerjpaproject扩展存储库querydsldpredicateexecutor{
@凌驾
列表findAll(谓词);
}
回购电话:

ArrayList<Contact> contacts = new ArrayList<>();
contacts.add(new Contact("a@b.c","8971"));
contacts.add(new Contact("e@f.g", "8888"));
customerJpaProjection.findAll(QCustomerQueryData.customerQueryData.contact.in(contacts));
ArrayList contacts=new ArrayList();
联系人。添加(新联系人(“a@b.c","8971"));
联系人。添加(新联系人(“e@f.g", "8888"));
customerjpaproject.findAll(QCustomerQueryData.customerQueryData.contact.in(contacts));

未经测试的代码。

我认为您只能执行以下操作
List findByEmailInAndMobileIn(列出电子邮件,列出手机)那太可悲了。你认为我应该在这个用例中使用SpringJDBCTemplate吗?这并不令人难过,这是它
SpringData
的构建方式。您给它一个自定义对象,spring数据无法理解它的含义。我不确定使用
@Query
注释并指定所需的sql语句是否适用于
Tuple
类。你得去看看。这正是我过去5-6个小时一直在寻找的。精彩的!
ArrayList<Contact> contacts = new ArrayList<>();
contacts.add(new Contact("a@b.c","8971"));
contacts.add(new Contact("e@f.g", "8888"));
customerJpaProjection.findAll(QCustomerQueryData.customerQueryData.contact.in(contacts));