如何为集合集编写Hibernate查询

时间:2011-10-09 12:41:44

标签: 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;
}

我的语言表如下所示

enter image description here

我想选择名字以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

2 个答案:

答案 0 :(得分:0)

使用Hibernate ASSOCIATION和CRITERIA可以实现这一点。虽然你看起来接近正确(虽然我不确定你为什么使用DetachedCriteria,而不是简单的Criteria),你应该参考这个 - http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html#querycriteria-associations - 来更多地了解如何构建这样的查询。

答案 1 :(得分:0)

试试这个:

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

其中languageNames是语言名称的集合。 如果您遇到无法解决“语言”的错误,请添加新别名。