How to use Spring + Hibernate query for join table

11,466

Hibernate/JPA build some kind of Database abstraction layer. Therefore it works with Entity (instead of tables) and relations (@ManyToOne...) to entities instead of explicite Joining Ids to get table columns.

@Entity
Person {
   @Id
   Long id;
   ...
   @OneToOne
   @JoinColumn(name = "customer_fk")   
   Customer customer;
   //NO other customer_fk mapping!!!
}


@Entity
Customer {
  @Id
  Long id; 
}

Now you can SELECT c from Person p LEFT JOIN p.customer c

Share:
11,466
Shinnachot Dejtanapong
Author by

Shinnachot Dejtanapong

Hello buddy

Updated on June 04, 2022

Comments

  • Shinnachot Dejtanapong
    Shinnachot Dejtanapong almost 2 years

    I using Spring MVC + Hibernate + MySql running on Tomcat with Intellij Editor

    I want to query HQL like MySql like this

    SELECT * from Customer c LEFT JOIN Person p ON p.idPerson = c.idCustomer
    

    It's not working it's return error like this

    HTTP Status 500 - Request processing failed; nested exception is org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join! [from com.springapp.mvc.model.Customer c LEFT JOIN Person p ON p.idPerson = c.idCustomer]
    

    Here's my database

        CREATE TABLE `Customer` (
      `idCustomer` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(45) DEFAULT NULL,
      PRIMARY KEY (`idCustomer`),
      CONSTRAINT `customer to person` FOREIGN KEY (`idCustomer`) REFERENCES `Person` (`idPerson`) ON DELETE NO ACTION ON UPDATE NO ACTION
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
        CREATE TABLE `Person` (
      `idPerson` int(11) NOT NULL AUTO_INCREMENT,
      `country` varchar(45) DEFAULT NULL,
      PRIMARY KEY (`idPerson`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    Relationship is OneToOne from customer.idCustomer to person.idPerson

    Here's my code

    model.Customer.java

    @Entity
    @Table(name = "Customer")
    public class Customer {
        private int idCustomer;
        private String name;
    
        @Id
        @Column(name = "idCustomer")
        public int getIdCustomer() {
            return idCustomer;
        }
    
        public void setIdCustomer(int idCustomer) {
            this.idCustomer = idCustomer;
        }
    
        @Basic
        @Column(name = "name")
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
    
            Customer customer = (Customer) o;
    
            if (idCustomer != customer.idCustomer) return false;
            if (name != null ? !name.equals(customer.name) : customer.name != null) return false;
    
            return true;
        }
    
        @Override
        public int hashCode() {
            int result = idCustomer;
            result = 31 * result + (name != null ? name.hashCode() : 0);
            return result;
        }
    }
    

    model.Person.java

    @Entity
    @Table(name = "Person")
    public class Person {
        private int idPerson;
        private String country;
    
        @Id
        @Column(name = "idPerson")
        public int getIdPerson() {
            return idPerson;
        }
    
        public void setIdPerson(int idPerson) {
            this.idPerson = idPerson;
        }
    
        @Basic
        @Column(name = "country")
        public String getCountry() {
            return country;
        }
    
        public void setCountry(String country) {
            this.country = country;
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
    
            Person person = (Person) o;
    
            if (idPerson != person.idPerson) return false;
            if (country != null ? !country.equals(person.country) : person.country != null) return false;
    
            return true;
        }
    
        @Override
        public int hashCode() {
            int result = idPerson;
            result = 31 * result + (country != null ? country.hashCode() : 0);
            return result;
        }
    }
    

    and this my Implement dao.CustomerDAOImpl.java

    public List<Customer> listCustomers() {
        Session session = this.sessionFactory.getCurrentSession();
        List<Customer> customersList = session.createQuery("from Customer c LEFT JOIN Person p ON p.idPerson = c.idCustomer").list();
    
        for (Customer c : customersList) {
            logger.info("Customer List::" + c);
        }
    
        return customersList;
    }
    

    Im am new java developer and poor in english somebody please help me Thank you