2
我有兩個實體具有單向惰性關係。其中一個有一個命名實體圖。這裏是(getter和setter方法不是由於可讀性上市)實體:條件API和實體圖
@Entity
@NamedEntityGraph (
name = "Sms.fetchSims",
attributeNodes = {
@NamedAttributeNode("sim")
}
)
public class Sms {
@Id
@GeneratedValue (strategy = GenerationType.AUTO)
private Long id;
@NotNull
private Timestamp date;
@NotNull
private String sender;
@NotNull
private String content;
@NotNull
private Direction direction;
@NotNull
@ManyToOne (fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
private Sim sim;
}
@Entity
public class Sim {
@Id
@GeneratedValue (strategy = GenerationType.AUTO)
private long id;
@NotNull
private long IMSI;
private String MSISDN;
private String provider;
private Timestamp lockedDate;
}
當我使用實體管理器find()方法與此實體圖形抓取任何短信,我得到一個SIM卡的短信。 但我希望能夠通過sim id找到smses。這就是爲什麼我爲此創建了一個標準api查詢。
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
EntityGraph eg = entityManager.getEntityGraph("Sms.fetchSims");
CriteriaQuery<Sms> cq = cb.createQuery(Sms.class);
Root<Sms> smses = cq.from(Sms.class);
Join<Sms, Sim> sims = smses.join(Sms_.sim);
cq.where(cb.equal(sims.get(Sim_.id), simId));
cq.orderBy(cb.desc(smses.get(Sms_.date)));
return entityManager
.createQuery(cq)
.setHint("javax.persistence.fetchgraph", eg)
.setMaxResults(1000)
.getResultList();
正如你看到的,我設置了實體圖形這裏使用類型查詢的setHint方法,但是SIM是從來沒有進賬,這是場甚至沒有在結果SQL上市。我能做些什麼來使實體圖與標準api一起工作?
我知道我可以強制轉換smses.fetch(Sms_.sim)加盟,但我得到醜陋的警告,這種方法看起來像一個骯髒的黑客我。
我與Hibernate和wildfly-8.2.0.Final應用服務器的工作。
兩個實體圖和標準查詢看起來很好。使用原生SQL查詢數據時它工作嗎?像'選擇我。* FROM短信中號INNER JOIN SIM我ON m.sim_id = i.id ORDER BY m.date' – wypieprz
@wypieprz,當然如果我使用SQL,它的工作,因爲我想要的。問題是當它不符合標準api :) – Wyvie