Lỗi Mapping trong Hibernate

Mình Mapping giữa 2 bảng có mối quan hệ onetomany mà bị gặp lỗi do câu sql nhưng chạy trong mySql thì không bị gì ?
Mình generate Entities -> Tables : “spring.jpa.hibernate.ddl-auto=create”
Company :

@Entity
@Table(name = "company")
public class Company {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private int id;

	@Column
	private String name;

	@Column
	private String location;

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "company")
	private List<Employee> employee;

Employee :

@Entity
@Table(name = "employee")
public class Employee {

	@Id
	@GeneratedValue
	private int id;

	@Column
	private String name;

	@Column
	private int age;

	@ManyToOne
	@JoinColumn(name = "company_id" ,nullable = false)
	private Company company;

Repository :

public interface EmployeeRepository extends JpaRepository<Employee, Integer>{

	/*@Query("select e from employee e inner join e.company")*/
	@Query("select e.name from company c , employee e where c.id=e.company_id and c.id = ?1")
	List<Employee> getAllEmployeeInCompany(int id);
	
}

Lỗi :

MySql chạy hoàn toàn bình thường !

:sunny: Mình Cảm ơn ! :writing_hand:

2 Likes

Bạn thử chỉnh câu query như thế này xem
@Query("select e.name from Employee e join fetch Company c where c.id = ?1")

6 Likes

Hibernate là truy vấn bằng tên entity. Message kia khả năng là sai tên bảng

5 Likes

Mà cái này thì dùng findById là ok mà. Hibernate nó tự map rồi thì cần gì join nữa

2 Likes

Mặc định JpaRepository sẽ truy vấn bằng HQL hay JPQL gì đó quên rồi, cho nên bạn phải dùng class Entity thay vì tên bảng như mấy bác ở trên đề cập.
Hoặc có thể sử dụng thuộc tính native = true để Repository hiểu query này là dạng SQL. @Query("Query here", native = true)

5 Likes

Tại sao mình đã thêm @JoinColumn vào rồi và trong DB cũng có ! Nhưng tại sao chúng lại không có mapping quan hệ với nhau vậy ? map

ở đây em tạo API để hiển thị danh sách Employee trong Company theo Id

@GetMapping("/companies/{company_id}/employee")
	public List<Employee> getAllEmployeeInCompany(@PathVariable int company_id) {
		return employeeService.getAllEmployeeInCompany(company_id);
	}

Newbie hỏi điều gì ngớ ngẩn thì mọi người thông cảm giúp em ạ !

em thử đổi xóa @table(name =…) đi thay vào đó là @entity(name=…). Hình như để @entity(name=…) thì tên bảng và tên entity sẽ trùng nhau, còn nếu để như em thì tên entity sẽ trùng với tên class

nếu không chỉ rõ ra thì tên của entity và table sẽ mặc định trùng tên class(có phân biệt viết hoa hay ko thì anh không nhớ), vậy nên mình nên đặt rõ tên entity, khi truy vấn sẽ dùng tên của entity này chứ ko phải tên table

nó trả có quan hệ đấy thôi. trong câu sql hibernate nó generic ra có lệnh tạo khóa ngoại kìa,

Hình như em bỏ thêm fetch = FetchType.LAZY vào database vẫn thêm record Employee được dù chưa có record ở bảng Company !

Trong thực tế thì thường là generate từ DB ra hay là mình viết Entity trước rồi tạo vào DB vậy ạ ?

Chịu. cái này tùy, chắc đang làm mock project hả. Làm mock thì cứ tự gen từ class ra đi. thiết kế làm sao cho nó gen ra database ok là được, cứ thử đi rồi thấy nó đầy lỗi cho mà xem :))
Mình thiết kế như thế sau này thế nào nó cũng bị đệ quy cho mà xem. Vì trong company có 1 list emp, rồi mỗi thằng employee lại có 1 company :))
tìm hiểu fix cái này lâu phết đấy

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?