Fetch records from Multiple tables having different type of primary key. Hibernate

You can use Java type casting where needed, to do specific operations. Firstly you bring all your three entity classes into one umbrella. Make then child class of a same parent class.

package com.solution.domain;

public class Domain {
}

Entity Class A

package com.solution.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class A extends Domain{
    @Id
    private Integer id;
    @Column (name="EMAILADDRESS")
    private String emailAddress;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getEmailAddress() {
        return emailAddress;
    }

    public void setEmailAddress(String emailAddress) {
        this.emailAddress = emailAddress;
    }


}

Entity Class B

package com.solution.domain;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class B extends Domain{
    @Id
    String ID;
    @Column (name="EMAILADDRESS")
    String emailAddress;

    public String getID() {
        return ID;
    }

    public void setID(String ID) {
        this.ID = ID;
    }

    public String getEmailAddress() {
        return emailAddress;
    }

    public void setEmailAddress(String emailAddress) {
        this.emailAddress = emailAddress;
    }
}

Entity Class C

package com.solution.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
public class C extends Domain{
    @Id
    Long ID;
   @Column (name="EMAILADDRESS")
    String emailAddress;

    public Long getID() {
        return ID;
    }

    public void setID(Long ID) {
        this.ID = ID;
    }

    public String getEmailAddress() {
        return emailAddress;
    }

    public void setEmailAddress(String emailAddress) {
        this.emailAddress = emailAddress;
    }

    @Override
    public String toString() {
        return "C{" +
                "ID=" + ID +
                ", emailAddress='" + emailAddress + '\'' +
                '}';
    }
}

Class to access all three JPA Repos collate results and sends a list

package com.solution.repo;

import com.solution.domain.A;
import com.solution.domain.B;
import com.solution.domain.C;
import com.solution.domain.Domain;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

    @Component
    public class DomainRepository {
    
        @Autowired
        ARepository aRepository;
        @Autowired
        BRepository bRepository;
        @Autowired
        CRepository cRepository;
    
        public List<Domain> findDomains(String email) {
            List<Domain> result = new ArrayList<>();
            List<A> aList;
            List<B> bList;
            List<C> cList;
            aList = aRepository.findByEmailAddress(email);
            if (Objects.nonNull(aList))
                result.addAll(aList);
            bList = bRepository.findByEmailAddress(email);
            if (Objects.nonNull(bList))
                result.addAll(bList);
            cList = cRepository.findByEmailAddress(email);
            if (Objects.nonNull(cList))
                result.addAll(cList);
            return result;
    
        }
    }

A sample on how you can operate the code with CommandLineRunner spring example

package com.solution;

import com.solution.domain.A;
import com.solution.domain.B;
import com.solution.domain.C;
import com.solution.domain.Domain;
import com.solution.repo.DomainRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;

import java.util.List;


@SpringBootApplication
public class SpringBootConsoleApplication implements CommandLineRunner {


    private static Logger LOG = LoggerFactory
            .getLogger(SpringBootConsoleApplication.class);



    public static void main(String[] args) {
        LOG.info("STARTING THE APPLICATION");
        SpringApplication.run(SpringBootConsoleApplication.class, args);
        LOG.info("APPLICATION FINISHED");
        LOG.info("EXECUTING : command line runner");

    }

    @Bean
    public DomainRepository getDomainRepository(){
        return new DomainRepository();

    }
    @Override
    public void run(String... args) {
        LOG.info("EXECUTING : command line runner");
        List<Domain> result=getDomainRepository().findDomains("raj@com");
        for(Domain entity: result){
            if(entity instanceof A){
                System.out.println(((A) entity).getId());
                //Do your operations here.
            }
            else if(entity instanceof B){
                System.out.println(((B) entity).getID());
                //Do your operations here.
            }
            else if(entity instanceof C){
                System.out.println(((C) entity).getID());
                //Do your operations here.
            }
        }
    }
}