【问题标题】:How to write sql join query using HQL如何使用 HQL 编写 sql 连接查询
【发布时间】:2013-11-01 11:11:21
【问题描述】:

我有两个实体 AddressEntity 和 CompanyEntity。

地址实体

@Entity
@Table(name = "address")
public class AddressEntity implements Serializable {

    private static final long serialVersionUID = 6149442393833549397L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;

    @Column(name = "city", nullable = false)
    private String city;

    @Column(name = "post")
    private String post;

    @Column(name = "street", nullable = false)
    private String street;

    @Column(name = "building_nr", nullable = false)
    private Integer buildingNr;

    @Column(name = "flat_nr")
    private Integer flatNr;

    // setters and getters
}

公司实体

@Entity
@Table(name = "company")
public class CompanyEntity implements Serializable {

    private static final long serialVersionUID = 3635072833730133590L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;

    @OneToOne
    @Cascade(CascadeType.ALL)
    private AddressEntity address = new AddressEntity();

    @OneToMany(mappedBy = "company")
    @Cascade(CascadeType.ALL)
    private Set<DescriptionEntity> descriptions = new HashSet<DescriptionEntity>();

    @OneToMany(mappedBy = "company")
    @Cascade(CascadeType.ALL)
    private List<EmployeeEntity> employees = new ArrayList<EmployeeEntity>();

}

我想select all addresses which are used by companies 就像在这个 SQL 查询 SELECT a.city, c.name FROM address a INNER JOIN company c ON c.address_id=a.id; 中一样,但使用 HQL 查询(我想使用 JOIN,而不是 WHERE)。我该怎么做?我想使用地址表而不是公司表来选择地址。我知道我可以使用像 select c.address.city, c.name from CompanyEntity c 这样的公司表或使用 WHERE select a.city, c.name from CompanyEntity c, AddressEntity a WHERE c.address.id=a.id 来选择地址。

【问题讨论】:

  • 如果您想使用地址表选择公司使用的地址,您需要在地址实体中添加地址和公司之间的关系
  • @pepuch 你为什么不写标准?
  • 我是 Hibernate 的新手。你能写出你的想法如何解决这个问题吗?

标签: sql hibernate


【解决方案1】:
Criteria c = session.createCriteria(CompanyEntity.class);
c.createAlias("address", "address");
List<CompanyEntity> companies = c.list();

这将为您提供至少有一个AddressEntity 的CompanyEntities 列表。

如果添加以下行:

c.criteria.setProjection(Projections.property("address"));

您将通过执行c.list() 获得AddressEntities 的列表。

如果你需要别的东西,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 2011-06-15
    • 2018-04-06
    • 2016-01-17
    • 2017-07-27
    • 1970-01-01
    相关资源
    最近更新 更多