无法解析Criteria API中的嵌入式实体

时间:2019-05-21 14:33:56

标签: java hibernate jpa hibernate-criteria

我正在尝试使用对嵌入式实体变量有限制的Criteria API执行获取。但是我收到以下错误,

org.hibernate.QueryException: could not resolve property: cpm of: org.sorabh.SystemEnt

下面是我的SystemEnt实体,

@Entity
@Table(name="system")
public class SystemEnt implements Serializable{

    @Id
    @Column(name="pmTpId", nullable = false)
    private int id; 

    @Column(name="pmMeasureId", nullable = false)
    private int pmMeasureId;    

    @OneToOne(fetch=FetchType.EAGER)    
    @JoinColumn(name="pmMeasureId", insertable=false, updatable=false)
    private Cpm cpm; 

    private String mapper;

    public int getId() {
    return id;
    }

    public int getPmMeasureId() {
    return pmMeasureId;
    }

    public Cpm getCpm() {
    return cpm;
    }

    public String getMapper() {
    return mapper;
    }

    public void setId(int id) {
    this.id=id;
    }

    public void setPmMeasureId(int pmMeasureId) {
    this.pmMeasureId=pmMeasureId;
    }

    public void setCpm(Cpm cpm) {
    this.cpm=cpm;
    }

    public void setMapper(int mapper) {
    this.mapper=mapper;
    }

我的CpmMeas包含

@Entity
@Table(name="cpm")
public class Cpm implements Serializable{

    @Id
    @Column(name="pmMeasureId", nullable = false)
    private int pmMeasureId; 

    @Column(nullable=false)
    private int pmGranularity
    //getters and setters

    public void setPmMeasureId(int pmMeasureId) {
    this.pmMeasureId=pmMeasureId;
    }

    public int getPmMeasureId() {
    return pmMeasureId;
    }

    public void setPmGranularity(int pmGranularity) {
    this.pmGranularity=pmGranularity;
    }

    public int getPmGranularity() {
    return pmGranularity;
    }

我在serviceImpl中执行以下操作:

Criteria cr = session.createCriteria(SystemEnt.class);
cr.add(Restrictions.like("mapper", "Test", MatchMode.START));
cr.add(Restrictions.eq("cpm.pmGranularity", 1));

我已经尝试过使用SO上其他几篇文章中建议的别名,但这似乎无法解决问题。 而且,它在解析映射器时没有问题,即仅嵌套实体和相应变量没有得到解析。

1 个答案:

答案 0 :(得分:1)

使用别名,为

Criteria cr = session.createCriteria(SystemEnt.class);
cr.createAlias("cpm","cpm");
cr.add(Restrictions.like("mapper", "Test", MatchMode.START));
cr.add(Restrictions.eq("cpm.pmGranularity", 1));

无论如何,字段映射器应该是一个字符串,在示例代码中它被定义为一个int。 我经过测试,毫无疑问,它工作正常。 enter image description here