Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.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 条件获取@manytone关系部分_Java_Hibernate_Criteria - Fatal编程技术网

Java 条件获取@manytone关系部分

Java 条件获取@manytone关系部分,java,hibernate,criteria,Java,Hibernate,Criteria,是否有方法仅使用条件部分获取关联的manytone关联实体 我有以下情况 @Entity public class Foo { @ManyToOne(optional = false, fetch = FetchType.LAZY) private Bar bar; // getters/setters and lots other attributes } @Entity public class Bar { private String name;

是否有方法仅使用条件部分获取关联的
manytone
关联实体

我有以下情况

@Entity
public class Foo {
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Bar bar;
    // getters/setters and lots other attributes
}

@Entity
public class Bar {
    private String name;
    @OneToMany(fetch = FetchType.EAGER)
    private Collection<ComplexObject> complexObjects;
    // getters/setters
}

不,不可能。当您将一个集合标记为已获取时,它总是热切地获取。如果您希望延迟加载,则应将其标记为lazy

但您只能选择三个属性:

Criteria c = session.createCriteria(Foo.class, "foo");
c.createAlias("foo.bar", "bar");
c.setProjection(Projections.projectionList().add(Projections.property("foo.attr1"))
                                            .add(Projections.property("foo.attr2"))
                                            .add(Projections.property("bar.name")));
或者,更具可读性:

String hql = "select foo.attr1, foo.attr2, bar.name from Foo foo"
             + " inner join foo.bar bar";

关于不让收藏被偷懒收藏的部分我知道。但你回答了我的问题:)我需要的就是这个投影。有没有办法让Hibernate将这个投影列表映射到Foo?有一种方法,使用ResultTransformer,但它非常脏。返回实体实例的方法应该返回实体实例,尊重它们的不变量和契约,附加到会话等。而不是一些半填充的对象。是的,这是事实。谢谢你的帮助:D
String hql = "select foo.attr1, foo.attr2, bar.name from Foo foo"
             + " inner join foo.bar bar";