Hibernate 内部联接完整实体类字段的休眠条件

Hibernate 内部联接完整实体类字段的休眠条件,hibernate,criteria-api,Hibernate,Criteria Api,我的实体模型类是 ------- A ----------- private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Column(name = "NameA") private String nameA; public B getBid() { r

我的实体模型类是

------- A -----------
private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "NameA")
    private String nameA;

    public B getBid() {
        return b;
    }

    public void setBid(B bid) {
        this.b = bid;
    }

    public String getNameA() {
        return nameA;
    }

    public void setNameA(String nameA) {
        this.nameA = nameA;
    }
    @JoinColumn(name = "BID", referencedColumnName = "ID")
    @ManyToOne(fetch= FetchType.LAZY)
    private B b;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
--------------------------------------------
------------------ B -----------------------

private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "NameB")
    private String nameB;


    public String getNameB() {
        return nameB;
    }

    public void setNameB(String nameB) {
        this.nameB = nameB;
    }


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
及 我想 进行此查询
session.createQuery(“从a中选择a.b”).list()


使用Criteria API???

因为您没有反向关系,而且Criteria不允许选择根实体以外的其他实体,所以您必须使用子查询,但它很难看:

DetachedCriteria subquery = DetachedCriteria.forClass(A.class, "a");
subquery.createAlias("a.b", "b2");
subquery.setProjection(Projections.property("b2.id"));

Criteria c = session.createCriteria(B.class, "b1");
c.add(Subqueries.propertyIn("b1.id", subquery));
如果你有从B到A的一对一的反向关系,你就必须这样做

Criteria c = session.createCriteria(B.class, "b1");
c.createAlias("b1.as", "a");

顺便说一句,这些非动态构造的查询使用HQL比使用CriteriaAPI更好地表达。如果您真正的查询是您要求的查询,只需使用HQL即可:它更具可读性和功能更强大。

您的示例和建议很好,但没有其他方法可以做到这一点?例如b.*或b.nameB类的特殊字段,在我的示例模型类之上的类没有映射注释我不确定是否理解。我给出了HQL查询的翻译:“从a中选择a.b”。此查询返回至少一个A实例引用的所有B实例。这是您想要的吗?如果没有,你想要什么?我只想做这个投影。属性或投影列表不想使用DetachedCriteria或子查询你告诉我你想怎么做,但不是你想做什么。请求应该返回什么?我不知道怎么做,但是在hibernate中有一种方法。B类的所有字段(表B中的列),该B类是具有多个One的类中的实例?