The error in question: jakarta.servlet.ServletException: java.lang.IllegalArgumentException: org.hibernate.query.SemanticException: Could not interpret path expression ‘brand_id’;
I am new to hibernate and REST Api design, so it eludes me why I get this error, I have tried so many things. "brand_id" is the name of the foreign key column in my database, you know what, lemme show you.
Here is my exposed GET endpoint:
`@GET
@Path("/{brandID}/products")
@Produces(MediaType.APPLICATION_JSON)
public List<ProductEntity> getProductsByBrand(@PathParam("brandID") int brandID) {
List<ProductEntity> productList = productsService.getProductsByBrand(brandID);
return productList;
}`
Here is my ProductsService class:
`public class ProductsService {
private final ProductsDAO dao = new ProductsDAO();
public List<ProductEntity> getProductsByBrand(int brandID) {
List<ProductEntity> productList = dao.getProductsByBrand(brandID);
return productList;
}
}`
And here is the ProductsDAO class:
`public class ProductsDAO {
private final SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(ProductEntity.class).addAnnotatedClass(BrandEntity.class) // since we are defining a foreign key in the ProductEntity, we are required to add the BrandEntity class as an Annotated Class .buildSessionFactory();
public List<ProductEntity> getProductsByBrand(int brandID) {
Session session = factory.getCurrentSession();
session.beginTransaction();
String hql = "from products where brand_id = '" + brandID + "'";
Query query = session.createQuery(hql);
List<ProductEntity> productList = query.getResultList();
return productList;
}
}`
And of course, my ProductEntity class:
`@Entity(name = "products")
@Table(name = "products")
public class ProductEntity {
@Id
@Column(name = "product_id")
private int productId;
// Essentially, this is how you specify a Foreign Key to hibernate
@ManyToOne(targetEntity = BrandEntity.class) // Specifies that this column has a multiplicity defined relationship with other entities, such as tables. It cannot be used on a primitve data type, only a entity class type, in addition, the column annotation cannot be used in conjunction with it.
@JoinColumn(name = "brand_id")
private BrandEntity brandEntity;
@Column(name = "product_name")
private String productName;
@Column(name = "category")
private String category;
@Column(name = "cost")
private String cost;
public ProductEntity() {
}
public ProductEntity(int productId, BrandEntity brandEntity, String productName, String category, String cost) {
this.productId = productId;
this.brandEntity = brandEntity;
this.productName = productName;
this.category = category;
this.cost = cost;
}
public int getProductId() {
return productId;
}
public void setProductId(int productId) {
this.productId = productId;
}
public BrandEntity getBrandEntity() {
return brandEntity;
}
public void setBrandEntity(BrandEntity brandEntity) {
this.brandEntity = brandEntity;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getCost() {
return cost;
}
public void setCost(String cost) {
this.cost = cost;
}
}`
If anyone can shed any light on this issue, i would be sincerely grateful.
Note: I receive this error when sending a GET request to the URI defined as : http://localhost:8008/104_-_RESTApp_ManyToOne_Mapping_In_Hibernate/showroom/brands/2/products, for example.
>Solution :
The error message "Could not interpret path expression ‘brand_id’" is indicating that Hibernate is having trouble understanding what you’re trying to do with the "brand_id" in your query.
It looks like there is an issue with the way you are querying for products based on the brand id. Your query string "from products where brand_id = ‘" + brandID + "’" is specifying a condition on the "brand_id" column, but in your ProductEntity class, the name of the field for the brand id is "brandEntity", not "brand_id".
To resolve this issue, you should modify your query to use the correct field name:
String hql = "from products where brandEntity.brandId = :brandID";
Query query = session.createQuery(hql);
query.setParameter("brandID", brandID);
Also, since the brand id is an integer, it’s a good idea to use the setParameter method to bind the value, rather than concatenating it into the query string, which can make your application vulnerable to SQL injection attacks.