在嵌入对象上使用 CriteriaBuilder
Use CriteriaBuilder on embedded object
我正在尝试将 @Embeddable
与 CriteriaBuilder
结合使用,以根据嵌入属性过滤父 Entity
的结果。我使用 Eclipse Link 生成元数据 classes.
这里是内嵌的class/entity:
@Embeddable
public class Stamp implements Serializable {
@Basic()
@Column(name = "stamp_year", nullable = false)
private int year;
父 class 有 Stamp
作为成员:
@Entity(name = "Message")
public class Message implements Serializable {
@Embedded
private Stamp stamp = new Stamp();
现在这段代码应该使用 Message
class 并根据嵌入的 class 属性过滤结果:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Message> cq = cb.createQuery(Message.class);
Root<Message> root = cq.from(Message.class);
Predicate p = cb.conjunction();
p = ??????
cq.where(p);
TypedQuery<Message> tq = em.createQuery(cq);
List<Message> messages = tq.getResultList();
第 5 行如何找到查询的 Message->Stamp->Year 元素?
这里是生成的元模型classes:
@StaticMetamodel(Message.class)
public class Message_ {
public static volatile SingularAttribute<Message, Stamp> stamp;
和:
@StaticMetamodel(Stamp.class)
public class Stamp_ {
public static volatile SingularAttribute<Stamp, Integer> year;
注意:为了代码清晰,我删除了所有不相关的信息,但完整代码可在 GitHub 上找到:
prototype
基于条件的查询可能如下所示:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Message> cq = cb.createQuery(Message.class);
Root<Message> root = cq.from(Message.class);
Predicate p = cb.conjunction();
ParameterExpression<Integer> year = cb.parameter(Integer.class, "year");
p = cb.and(p, cb.equal(root.get(Message_.stamp).get(Stamp_.year), year));
cq.where(p);
TypedQuery<Message> tq = em.createQuery(cq).setParameter("year", 2015);
List<Message> messages = tq.getResultList();
我正在尝试将 @Embeddable
与 CriteriaBuilder
结合使用,以根据嵌入属性过滤父 Entity
的结果。我使用 Eclipse Link 生成元数据 classes.
这里是内嵌的class/entity:
@Embeddable
public class Stamp implements Serializable {
@Basic()
@Column(name = "stamp_year", nullable = false)
private int year;
父 class 有 Stamp
作为成员:
@Entity(name = "Message")
public class Message implements Serializable {
@Embedded
private Stamp stamp = new Stamp();
现在这段代码应该使用 Message
class 并根据嵌入的 class 属性过滤结果:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Message> cq = cb.createQuery(Message.class);
Root<Message> root = cq.from(Message.class);
Predicate p = cb.conjunction();
p = ??????
cq.where(p);
TypedQuery<Message> tq = em.createQuery(cq);
List<Message> messages = tq.getResultList();
第 5 行如何找到查询的 Message->Stamp->Year 元素?
这里是生成的元模型classes:
@StaticMetamodel(Message.class)
public class Message_ {
public static volatile SingularAttribute<Message, Stamp> stamp;
和:
@StaticMetamodel(Stamp.class)
public class Stamp_ {
public static volatile SingularAttribute<Stamp, Integer> year;
注意:为了代码清晰,我删除了所有不相关的信息,但完整代码可在 GitHub 上找到: prototype
基于条件的查询可能如下所示:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Message> cq = cb.createQuery(Message.class);
Root<Message> root = cq.from(Message.class);
Predicate p = cb.conjunction();
ParameterExpression<Integer> year = cb.parameter(Integer.class, "year");
p = cb.and(p, cb.equal(root.get(Message_.stamp).get(Stamp_.year), year));
cq.where(p);
TypedQuery<Message> tq = em.createQuery(cq).setParameter("year", 2015);
List<Message> messages = tq.getResultList();