java - 使用连接和类似运算符的 Hibernate 查询

标签 java hibernate

我有两个模型类:

第 1 类看起来像这样:

@Entity
@Table(name = "cdm_location_charge_class", catalog = "emscribedx")
public class Cdm_location_charge_class {
    private static Logger LOG = Logger.getLogger(Cdm_location_charge_class.class);
    private int indx;
    private String location;
    private String charge_Class;
    private List <Cdm_trans> cdm_Trans;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "indx")
    public int getIndx() {
        return indx;
    }
    public void setIndx(int indx) {
        this.indx = indx;
    }   
    @Column(name = "location")
    public String getLocation() {
        return location;
    }
    public void setLocation(String location) {
        this.location = location;
    }
    @Column(name = "charge_Class")
    public String getCharge_Class() {
        return charge_Class;
    }
    public void setCharge_Class(String charge_Class) {
        this.charge_Class = charge_Class;
    }
    @OneToMany (mappedBy = "cdm_location_charge_class", targetEntity = Cdm_trans.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    public List<Cdm_trans> getCdm_Trans() {
        return cdm_Trans;
    }
    public void setCdm_Trans(List<Cdm_trans> cdm_Trans) {
        this.cdm_Trans = cdm_Trans;
    }
<小时/>

第 2 类看起来像这样:

@Entity
@Table(name = "cdm_Trans", catalog = "emscribedx")
public class Cdm_trans {
private static Logger LOG = Logger.getLogger(Cdm_trans.class);

private int indx;
private String charge_Class;
private String charge_Code;
private String charge_Description;
private String charge_Eligibility;
private String exp_Date;
private BigDecimal rate_Charge;
private String cpt_Code;
private int rev_Code;
private String charge_Type;
private Cdm_location_charge_class cdm_location_charge_class;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "indx")
public int getIndx() {
    return indx;
}

public void setIndx(int indx) {
    this.indx = indx;
}

@Column(name = "charge_Class")
public String getCharge_Class() {
    return charge_Class;
}

public void setCharge_Class(String charge_Class) {
    this.charge_Class = charge_Class;
}

@Column(name = "charge_Code")
public String getCharge_Code() {
    return charge_Code;
}

public void setCharge_Code(String charge_Code) {
    this.charge_Code = charge_Code;
}

@Column(name = "charge_Description")
public String getCharge_Description() {
    return charge_Description;
}

public void setCharge_Description(String charge_Description) {
    this.charge_Description = charge_Description;
}

@Column(name = "charge_Eligibility")
public String getCharge_Eligibility() {
    return charge_Eligibility;
}

public void setCharge_Eligibility(String charge_Eligibility) {
    this.charge_Eligibility = charge_Eligibility;
}

@Column(name = "exp_Date")
public String getExp_Date() {
    return exp_Date;
}

public void setExp_Date(String exp_Date) {
    this.exp_Date = exp_Date;
}

@Column(name = "rate_Charge")
public BigDecimal getRate_Charge() {
    return rate_Charge;
}

public void setRate_Charge(BigDecimal rate_Charge) {
    this.rate_Charge = rate_Charge;
}

@Column(name = "cpt_Code")
public String getCpt_Code() {
    return cpt_Code;
}

public void setCpt_Code(String cpt_Code) {
    this.cpt_Code = cpt_Code;
}

@Column(name = "rev_Code")
public int getRev_Code() {
    return rev_Code;
}

public void setRev_Code(int rev_Code) {
    this.rev_Code = rev_Code;
}

@Column(name = "charge_Type")
public String getCharge_Type() {
    return charge_Type;
}

public void setCharge_Type(String charge_Type) {
    this.charge_Type = charge_Type;
}

@ManyToOne
@JoinColumn(name = "charge_Class", insertable = false, updatable = false)
public Cdm_location_charge_class getCdm_location_charge_class() {
    return cdm_location_charge_class;
}

public void setCdm_location_charge_class(
        Cdm_location_charge_class cdm_location_charge_class) {
    this.cdm_location_charge_class = cdm_location_charge_class;
}
}
<小时/>

这两个类对应两个基础表:

Cdm_trans 和 Cdm_location_charge_class。

我想创建一个 Hibernate 服务,它将给出与以下 sql 查询相同的结果:

select cdm_trans.* from Cdm_trans, Cdm_location_charge_class where 
cdm_location_charge_class.charge_Class = cdm_trans.charge_Class and 
cdm_location_charge_class.location = <Some location passed to the method> and
Cdm_trans.charge_Description like '%<Some search term passed into the method>%;

我的偏好是使用 Hibernate criteria API 来完成此操作。但如果这是唯一的方法,我会选择 HQL。有人可以告诉我该怎么做吗?

我尝试过这个 HQL 查询:

Query query = session.createQuery("FROM cdm_location_charge_class as cl  INNER JOIN   cl.cdm_Trans where cl.location = :location and  cdm_Trans.charge_Description like :search");

但是我收到一个错误: cdm_location_charge_class 未映射

最佳答案

如果您想使用 Criteria,只需添加限制即可。

 List cats = session.createCriteria(Cat.class)
     .createCriteria("kittens")
         .add( Restrictions.like("name", "Iz%") )
     .list();

HQL 示例:

Query query = session.createQuery("FROM Cdm_location_charge_class cl " + 
   "INNER JOIN cl.cdm_Trans trans " +
   "where cl.location = :location and trans.charge_Description like :search")
   .setParameter("location", locationValue)
   .setParameter("search", "%" + searchValue + "%");

关于java - 使用连接和类似运算符的 Hibernate 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20683188/

相关文章:

java - 在编写测验程序时,我可以在单独的项目中对每个测验进行编码并在最后添加它们吗?或者我必须从一开始就在一个项目中创建它们?

java - 有没有办法通过使用 nextLine() 读取空行来退出 while 循环? ( java )

java - JPA:在接口(interface)中使用 @Embeddable 和 @EmbeddedId

java - 如何在子查询(hql)中选择多列

hibernate - org.hibernate.NonUniqueObjectException

java - 正则表达式通配符匹配

java - 字节码以未记录的方式随时间变化

java - Servlet IP 过滤器

java - JPA/Hibernate Spring @Transactional 与 JOIN FETCH

mysql - 即使数据库中不存在实体,如何让 hibernate 返回实体