Перевод в спящий режим однонаправленного запроса ManyToOne по свойству дочернего элемента

#java #hibernate

#java #переход в спящий режим

Вопрос:

 @Entity
public class Store {}


@Entity
@Table(name = "storeitem")
public class StoreItem {

    @Id @Column
    private Integer storeId;

    @Id
    @ManyToOne @JoinColumn (name="productId", referencedColumnName="id")
    private Product product;

    @Column private Double cost;
}

mysql> desc storeitem;
 ------------- --------------------- ------ ----- --------- ------- 
| Field       | Type                | Null | Key | Default | Extra |
 ------------- --------------------- ------ ----- --------- ------- 
| StoreId     | int(10) unsigned    | NO   | PRI | 0       |       |
| ProductId   | bigint(20) unsigned | NO   | PRI | 0       |       |
| cost        | double unsigned     | NO   |     | 0       |       |



@Entity
@Table(name = "product")
public class Product {
    @Id @GeneratedValue @Column(name = "Id")
    private Long id;

    @Column(name = "Name")
    private String name;
}

mysql> desc product;
 ------------- --------------------- ------ ----- --------- ---------------- 
| Field       | Type                | Null | Key | Default | Extra          |
 ------------- --------------------- ------ ----- --------- ---------------- 
| Id          | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| Name        | varchar(70)         | NO   |     |         |                |




 Criteria cr=sess.createCriteria(StoreItem.class);
 cr.add(Restrictions.eq("product.name","butter"));
 cr.list();
  

Когда я пытаюсь выполнить фильтрацию по свойству дочернего элемента, я получаю следующее исключение

 org.hibernate.QueryException: could not resolve property: product.name of:StoreItem
  

Ответ №1:

 Try{

    Criteria cr=sess.createCriteria(StoreItem.class, "si");
     crit.createCriteria("product","product").add(Restrictions.eq("name","butter"));
     cr.list();

}
  

Комментарии:

1. Я попробовал ‘cr.add(Restrictions.eq(«product»,»продукт»)) .add(Restrictions.eq(«name»,»butter»));’ и я получил эту ошибку ‘org.hibernate. Исключение QueryException: не удалось разрешить свойство: имя: StoreItem’

2. извините за ошибку в коде, смотрите отредактированный код. если попытка не удалась Product,Product.class , я не знаю больше аннотаций на основе вот почему.

Ответ №2:

HQL решил проблему

 String hql="from StoreItem where productId in (select pd.id from Product pd where name = 'butter')";
Query query=sess.createQuery(hql);
query.list();