列表字段/属性和Restricted.in上的Hibernate Projection

时间:2012-08-03 06:29:12

标签: java hibernate

我有以下产品类

productClass
productID
name
make
title
colors {1..*}.

我想要

productIDcolorsname字段..

我的产品适用于单attirbutecolorList未被检索。

最糟糕的是..当我有一个标准(restrictions.in)时,它说sql表格不正确..缺少属性y1 _

一个很好的例子是

Hibernate criteria with projection not performing query for @OneToMany mapping

我正在尝试使用项目来支付费用完整的付款,否则他试图在费用中获得一些字段

2 个答案:

答案 0 :(得分:1)

如果您想为任何颜色列表项目投影任何属性集,请考虑使用http://github.com/moesio/seimos这里是一个示例:

例如,您可以使用以下标准:

Criteria criteria = session.createCriteria(Cat.class);
criteria.add(Restrictions.like(“description”, “Pap”)
  .addOrder(Order.asc(“description”);

Criteria subCriteria = criteria.createCriteria("kind", "kind");
subCriteria.add(Restrictions.eq("description", "persa"));

Criteria anotherSubCriteria = subCriteria.createCriteria("anAssociation","anAssociation");
anotherSubCriteria.add(Restrictions.eq("attribute", "anything"));

criteria.setResultTransformer(new AliasToBeanResultTransformer(Cat.class));

criteria.crateAlias(“kind.anAssociation”, “kind_anAssociation”);

criteria.setProjection(Projections.projectionList()
  .add(Projections.alias(Projections.property(“id”), “id”))
  .add(Projections.alias(Projections.property(“kind.id”, “kind.id”))
  .add(Projections.alias(Projections.property(“kind.anAssocation.attribute”, “kind.anAssociation.attribute”))

List cats = criteria.list();

但是如果你想保存一些代码,你可以使用Seimos和代码

Filters filters = new Filters();
filters.add(new Filters(“description”, “Pap”)
  .add(new Filter(“description”))
  .add(new Filter("kind.description", "persa"))
  .add(new Filter("kind.anAssociation.attribute", "anything"));
List<Cat> cats = dao.find(filters);

因此,请考虑使用http://github.com/moesio/seimos

答案 1 :(得分:0)

如果我理解正确,那么您可以将此类查询用于您的目的:

    List<Object[]> results = sess.createCriteria(Category.class, "category")
                .add(Restrictions.in("category.name", new String[]{"Test1", "Test2"}))
                .createAlias("items", "item")
                .setProjection(Projections.projectionList()
                        .add(Projections.property("category.id"), "categoryId")
                        .add(Projections.property("category.name"), "categoryName")
                        .add(Projections.property("item.name"))
                        .add(Projections.property("item.initialPrice")))
         .list();

它将返回表示结果每一行的Object []数组列表。

我不知道您的Color实体的结构以及您需要哪些字段,这就是我为两个默认实体发布示例的原因:类别和项目(他们的关系是一对多的,如您的情况)。

您可以使用List代替数组。例如,您可以通过以下方式在上面的示例中定义重新定义:

 List<String> inRestrictions = new ArrayList<String>();
 inRestrictions.add("Test1");
 inRestrictions.add("Test2");

    ...
    .add(Restrictions.in("category.name", inRestrictions))
    ...

修改

如果您需要带有颜色列表的Product对象,则只获取它。如果你定义了正确的映射,那么将使用它(懒惰或急切地)获取颜色列表。

List<Product> results = sess.createCriteria(Product.class)
       .add(Restrictions.in("... necessary restrictions")
       .list()