我正在尝试使用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>
无论我做什么,我最终都会将嵌套表空为空,并且子查询永远不会触发(由于我的高科技日志,我可以告诉它!)。我错过了什么? (对不起文字的墙......)
答案 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));