Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hibernate query with an alias

What's wrong with

session.createCriteria(Composed.class, "main")
.createAlias("main.id.branch", "b1")
.add(Restrictions.eq("b1.owner", user))
.list();

? The corresponding HQL works fine

String hql = "select main from Composed as main"
        + "left join main.id.branch as b1 where b1.owner = ?";
session.createQuery(hql)
.setInteger(0, user.id().intValue())
.list();

From the Criteria, Hibernate creates no join and uses where b1x1_.owner_id=?, but there's no b1x1_ anywhere, so it fails with "could not prepare statement".

The classes are rather trivial

@Entity class Composed {
    @Id ComposedId id; // also tried @EmbeddedId
    ... irrelevant stuff
}

@Embeddable class ComposedId {
    @ManyToOne(optional=false) Branch branch;
    ... irrelevant stuff
}

@Entity class Branch {
    @Id Integer id;
    @ManyToOne(optional=false) User owner;
    ... irrelevant stuff
}

@Entity class User {
    @Id Integer id;
    ... irrelevant stuff
}

Update

I've finally created an SSCCE and filed an issue. Sorry for the confusing question, without the SSCCE, it's rather hard to reproduce.

like image 615
maaartinus Avatar asked Dec 05 '15 12:12

maaartinus


1 Answers

I didn't try but maybe creating two aliases with left join helps you. I mean this:

session.createCriteria(Composed.class, "main")
   .createAlias("main.id", "id1", JoinType.LEFT_OUTER_JOIN)
   .createAlias("id1.branch", "b1", JoinType.LEFT_OUTER_JOIN)
   .add(Restrictions.eq("b1.owner", user))

Hope it helps!

like image 196
malaguna Avatar answered Sep 28 '22 08:09

malaguna