Hibernate条件查询显示子项

时间:2016-01-06 02:58:16

标签: hibernate jsp spring-mvc hibernate-criteria

我正在尝试使用Hibernate为数据部分开发一个当前非常简单的Web应用程序。基本上,我试图为每个类别获取一个表格。在每行的一个单元格中,我想显示该类别的KPI。为此,我试图使用标准对象。直接的问题是我无法做任何事情导致第二个查询甚至触发。

以下是我的代码中有希望相关的部分。我尝试过各种各样的东西,这就是我现在所拥有的东西。

Category.java

    @Entity
@Table(name="category")
public class Category {
    @Id
    @Column(name="category_id")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;

    @Column(name="category_name")
    private String categoryName;

    @Transient
    private Kpi[] kpis;
...
    public Kpi[] getKpis() {
        return this.kpis;
    }
}

CategoryDAO

public interface CategoryDAO {

    public List<Category> listCategories();
    public Category getCategoryById(int id);
    public List<Kpi> getKpisForCategory(int cat);
}

CategoryDAOImpl

public class CategoryDAOImpl implements CategoryDAO {
    private SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sf){
        this.sessionFactory = sf;
    }

...
    @SuppressWarnings("unchecked")
    @Override
    public List<Kpi> getKpisForCategory(int cat) {
        Session session = this.sessionFactory.getCurrentSession();
        Criteria criteria = session.createCriteria(Kpi.class).add(Restrictions.eq("category_id",cat));
        return criteria.list();
    }
}

CategoryServiceImpl

 @Service
    public class CategoryServiceImpl implements CategoryService {

        private CategoryDAO categoryDAO;

        public void setCategoryDAO(CategoryDAO dao) {
            this.categoryDAO = dao;
        }
...    
        @Override
        public List<Kpi> listKpisForCategory(int cat) {
            System.out.println("in service method");
            return this.categoryDAO.getKpisForCategory(cat);
        }
    }

JSP

<c:if test="${!empty listCategories}">
    <table class="tg">
        <tr>
            <th width="80">Category ID</th>
            <th width="120">Category Name</th>
        </tr>
        <c:forEach items="${listCategories}" var="category">
        <tr>
            <td>${category.id}</td>
            <td>${category.categoryName}</td>
            <td>
                <table class="tg">
                    <tr>
                        <th>KPI Name</th>
                    </tr>
                    <tr>

                    <c:forEach items="${category.kpis }" var="kpi">
                        <td>${category.id}
                        <td>${kpi.kpiName }</td>
                    </c:forEach>
                    </tr>
                </table>
            </td>
        </tr>
        </c:forEach>
    </table>    
</c:if>

无论我做什么,我最终都会将嵌套表空为空,并且子查询永远不会触发(由于我的高科技日志,我可以告诉它!)。我错过了什么? (对不起文字的墙......)

2 个答案:

答案 0 :(得分:1)

感谢@Naros的评论,我能够让它发挥作用。在CategoryDAOImpl类中,我在listCategories()方法中添加了一些代码来填充Category对象中的Kpi列表:

@SuppressWarnings("unchecked")
    @Override
    public List<Category> listCategories() {
        System.out.println("dao impl list categories");
        Session session = this.sessionFactory.getCurrentSession();
        List<Category> categoryList = session.createQuery("from Category").list();

        for (Category c : categoryList) {
            List<Kpi> kpiList = getKpisForCategory(c.getId());
            c.setKpis(kpiList);
        }
        return categoryList;
    }

答案 1 :(得分:0)

您的Kpi课程应该引用类别字段(让我们将其命名为&#34;类别&#34;)。然后你的DAO应该为类别创建引用标准并在那里添加你的限制。

Criteria criteria = session.createCriteria(Kpi.class);
Criteria categoryCriteria = criteria.createCriteria("category");
categoryCriteria.add(Restrictions.eq("id",cat));
return criteria.list();

或者您可以尝试criteria.add(Restrictions.eq("category.id",cat));