Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Hibernate中仅从OneToMany集合中选择一些属性? TL;博士_Java_Hibernate - Fatal编程技术网

Java 如何在Hibernate中仅从OneToMany集合中选择一些属性? TL;博士

Java 如何在Hibernate中仅从OneToMany集合中选择一些属性? TL;博士,java,hibernate,Java,Hibernate,如何获得B集合中只有几个属性的单个a对象 解释 我正在从事一个遗留项目,人们有一个绝妙的想法,将每一段关系都描绘成渴望的关系 现在,我们遇到了性能问题 例如,我有一个类A,它有一个B对象的列表。该列表在hibernate中被映射为一个包,并且到目前为止一直在缓慢加载,很好。问题是,B急切地加载整个奇怪的字母表: A.hbm.xml 但是我需要一个唯一的结果,因此下面的查询会导致异常。您可以在将上述SQL转换为条件后设置结果转换器。在这种情况下,AliasToBeanConstructor或Res

如何获得B集合中只有几个属性的单个a对象

解释 我正在从事一个遗留项目,人们有一个绝妙的想法,将每一段关系都描绘成渴望的关系

现在,我们遇到了性能问题

例如,我有一个类A,它有一个B对象的列表。该列表在hibernate中被映射为一个包,并且到目前为止一直在缓慢加载,很好。问题是,B急切地加载整个奇怪的字母表:

A.hbm.xml


但是我需要一个唯一的结果,因此下面的查询会导致异常。

您可以在将上述SQL转换为条件后设置结果转换器。在这种情况下,AliasToBeanConstructor或ResultTransformer可以工作

首先创建一个类以包含来自条件的结果列

public class ResultPresenter{

private String a;
private String bField1;
private Integer bField2;
private String bField3;
private String bField4;

public ResultPresenter(String a, String bField1, Integer bField2, String bField3, String bField4){

this.a = a;
this.bField1 = bField1;
this.bField2 = bField2;
this.bField3 = bField3;
this.bField4 = bField4;
}
}
java.lang.reflect.Constructor cons = ResultPresenter.class.getConstructor(Arrays.asList(new Class[]{String.class, String.class, Integer.class, String.class, String.class}));

criteria.setResultTransformer(new AliasToBeanConstructorResultTransformer(cons));
设置所需列的投影

ProjectionList projectionList = Projections.projectionList();
createProjectionList.add(projections.property(a));
createProjectionList.add(projections.property(b.field1));
createProjectionList.add(projections.property(b.field2));
createProjectionList.add(projections.property(b.field3));
createProjectionList.add(projections.property(b.field4));
将AliasToBeanConstructorResultTransformer设置为条件

public class ResultPresenter{

private String a;
private String bField1;
private Integer bField2;
private String bField3;
private String bField4;

public ResultPresenter(String a, String bField1, Integer bField2, String bField3, String bField4){

this.a = a;
this.bField1 = bField1;
this.bField2 = bField2;
this.bField3 = bField3;
this.bField4 = bField4;
}
}
java.lang.reflect.Constructor cons = ResultPresenter.class.getConstructor(Arrays.asList(new Class[]{String.class, String.class, Integer.class, String.class, String.class}));

criteria.setResultTransformer(new AliasToBeanConstructorResultTransformer(cons));

我能够通过两个查询实现我所需要的。一个用于获取对象A,另一个用于填充B对象列表。我想我们可以用两个标准和投影来做同样的事情

首先,我在类B中创建了一个新构造函数:

class B {
    public B(String field1, String field2, String field3, String field4) {
        this.field1 = field1;
        this.field2 = field2;
        this.field3 = field3;
        this.field4 = field4;
    }
}
然后,我创建了查询:

public A fetch(Integer id) {
    // try-catch abstracted
    Query query = getSession.createQuery("from A a where a.id = :id");
    query.setParameter("id", id);

    A a = (A) query.uniqueResult();

    query = getSession().createQuery("select new B(b.field1, b.field2, b.field3, b.field4) from B where b.A.id = :id");
    query.setParameter("id", id);

    List<B> bs = query.list();

    a.setListOfBs(bs);

    return a;
}

请在hbm的set标签中注明订单

<set name="subCompanies" lazy="false" order-by="lower(companyName)">
            ------------------------------
            ------------------------------          
</set>

你能使用标准API吗?如果可能,您可以将结果转换器设置为条件。在这种情况下,将使用别名ToBeanConstructor或ResultTransformerwork@SAP美好的我也可以将ResultTransformer设置为查询,我会试试。将您的评论作为答案发布,以便我可以接受它,以防它起作用!嗨,对不起!我尝试了你的解决方案,但它给了我一个PropertyAccessException。。。我也尝试映射别名,但得到了相同的结果。我想这毕竟不是那么简单。嗨,要么是我实现错了,要么是缺少了什么。。。无论如何,我已经用两个查询解决了这个问题。谢谢你的帮助!
<set name="subCompanies" lazy="false" order-by="lower(companyName)">
            ------------------------------
            ------------------------------          
</set>