java - 如何在 Hibernate 中访问标准中的 Object.field

标签 java hibernate exception properties hibernate-criteria

我已经写了公司级别的标准。 以下是公司类别、公司搜索类别和标准。但条件列表抛出异常。异常(exception)是“org.hibernate.QueryException:无法解析属性:san.san of:com.sesami.common.domain.Company”。如何访问Company.san.san?

公司类别

public class Company extends DomainObject implements UserDetails {
private Long id;
private String companyName;
private CompanyType companyType;
private String description;
private String companyURL;
private String billToEmail;
private String hashPassword;
private SAN san;

@OneToOne(cascade = { CascadeType.ALL })
public SAN getSan() {
    return san;
}

public void setSan(SAN san) {
    this.san = san;
}
...
}

公司搜索

public class CompanySearch {
private String companyName;
private String email;
private Long san;
private String gstNumber;
......
public Long getSan() {
    return san;
}

public void setSan(Long san) {
    this.san = san;
}
...
}

标准

companyCriteria = this.getSession().createCriteria(
            Company.class);

    if (companySearch.getSan() != null
            && !"".equals(companySearch.getSan()))
        companyCriteria.add(Restrictions.eq("san.san",
                companySearch.getSan()));

    Integer count = ((Long) companyCriteria.setProjection(
            Projections.rowCount()).uniqueResult()).intValue();
    companyCriteria.setProjection(null);
    companyCriteria.setResultTransformer(Criteria.ROOT_ENTITY);
    companyCriteria
            .setFirstResult((pager.getPage() - 1) * pager.getPageSize())
            .setMaxResults(pager.getPageSize()).list();
    List<Company> companies = companyCriteria.list();

    PagedResultSet pr = new PagedResultSet();
    pr.setPager(pager);
    pr.setResultSet(companies);
    pr.setRowCount(count);
    return pr;

最佳答案

您必须使用子条件或别名创建到 San 实体的联接:

companyCriteria.createAlias("san", "sanAlias"); 
companyCriteria.add(Restrictions.eq("sanAlias.san",
                    companySearch.getSan()));

companyCriteria.createCriteria("san").add(Restrictions.eq("san",
                                          companySearch.getSan()));

这在Hibernate reference documentation中有很好的解释。甚至在 Criteria javadoc .

请注意,这与 Spring 完全无关,而与 Hibernate 有关。如果您在 Spring 文档中搜索了如何执行此操作,难怪您没有找到任何内容。

关于java - 如何在 Hibernate 中访问标准中的 Object.field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8868846/

相关文章:

java - 在 Java Swing 中从右到左制作单选按钮

java - 未索引字段的部分更新

java - 需要帮助按字母顺序对文本文件进行排序

java - 模拟测试不返回任何值Java Junit

java - 不要停止对异常的评估?

c# - .net 中的自定义属性和异常

java - 正确打印servlet异常的stacktrace

在 JavaFX 应用程序线程以外的线程上进行 ImageIO 调用的 JavaFX 应用程序在 Mac OS X 上挂起

java - 当它可能为空时如何从 Hibernate 返回一个唯一的结果?

java - 使 UTF-8 可用于使用 Spring 将阿拉伯语数据放入 Mysql DB