Как написать запрос гибернации для набора коллекций

#hibernate #hibernate-criteria #detachedcriteria

#гибернация #переход в спящий режим-критерии #разделенные критерии

Вопрос:

У меня есть следующий объект

 @Entity
public class Employee{

    private Integer id;
    private String name;
    private String address;
    private Date created;
    @OneToMany(mappedBy = "employee")
    private Set<Language> languages = new HashSet<AlbumUser>()
}
  

и языковой объект является

   @Entity
    public class Language{

    private String name;
    @ManyToOne
    @JoinColumn(name = "employee_id") 
    private Employee employee;
}
  

моя языковая таблица выглядит следующим образом

введите описание изображения здесь

Я хочу выбрать всех сотрудников, чье имя начинается с A и кто знает Java и C, и для этого я пытаюсь сделать следующее

 DetachedCriteria criteria = DetachedCriteria.forClass(Employee.class,"employee");
 criteria.add( Restrictions.ilike("name", "A%") );
 criteria.add(Restrictions.in("languages",languageSet));
 return getHibernateTemplate().findByCriteria(criteria)
  

где находится languageSet

 Set<Language> languageSet = new HashSet();
languageSet.add(new Language("Java"));
languageSet.add(new Language("C"));
  

Я вижу, что моя попытка совершенно неверна…Я новичок в гибернации, может кто-нибудь, пожалуйста, помочь мне с этим..

 Caused by: java.sql.SQLException: No value specified for parameter 2
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
    at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2176)
    at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2100
  

Ответ №1:

Это должно быть достижимо с использованием ассоциаций гибернации с критериями. Хотя вы выглядите близко к правильному (хотя я не уверен, почему вы используете DetachedCriteria, а не простые критерии), вам следует обратиться к этому — http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html#querycriteria-associations — чтобы узнать больше о том, как следует создавать такие запросы.

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

1. Я уже прошел по предоставленной ссылке… но поскольку я новичок в гибернации, я не могу следовать документации .. поэтому я пытаюсь учиться на практике… Не могли бы вы сообщить мне запрос, который я могу использовать здесь

2. можете ли вы, плз, добавить трассировку к вопросу?

Ответ №2:

Попробуйте это:

 criteria.add(Restrictions.in("languages.name",languageNames));
  

где languageNames — это набор названий языков.
Если у вас ошибка, что «языки» не могут быть решены, добавьте новый псевдоним.