【问题标题】:Hibernate Projection on list Field/Attribute and Restricted.in列表字段/属性和 Restricted.in 上的休眠投影
【发布时间】:2012-08-03 06:29:12
【问题描述】:

我有以下产品类别

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

我正在努力

仅限productIDcolorsname 字段..

我的产品适用于单个 attirbute,但未检索到 colorList

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

一个很好的例子是

Hibernate criteria with projection not performing query for @OneToMany mapping

我正在尝试使用项目获得完整的费用付款,而他正在尝试获取费用中的某些字段

【问题讨论】:

  • 您能否向我们展示您当前拥有的失败的 Hibernate 代码,以及您收到的完整错误消息?
  • 如果colors是一个列表,应该是其他表。
  • 是的,颜色是一个列表,在另一个表中。由于敏感,我无法显示错误消息。但是当我使用 Restriction.in("productID",idList);它不能与投影一起使用,但在没有投影的情况下也可以使用。

标签: java hibernate


【解决方案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

【讨论】:

    【解决方案2】:

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

        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 实体的结构以及您需要从中获取哪些字段,这就是为什么我发布了两个默认实体的示例:Category 和 Item(它们的关系在您的情况下是一对多的)。

    您可以使用 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()
    

    【讨论】:

    • 如何添加 .setResultTransformer(Tranformers.(Product.class)
    • 您可以将“.setResultTransformer(Transformers.aliasToBean(Product.class))”添加到标准中,但为什么呢?您将丢失从颜色表中获取的所有数据。您将获得仅设置几个属性的 Product 对象。
    • 在这种情况下,您的映射是错误的。发布它,也许我可以帮你解决它。
    • 从颜色表中获取的所有数据 -??我同时需要颜色..“产品”对象中的所有内容。
    • 请发布您的实体并为其映射(如果您使用 xml 映射)。并尝试清楚地解释您想要做什么。因为现在我不明白你想要什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 2015-07-17
    • 1970-01-01
    相关资源
    最近更新 更多