Hibernate - 为 INNER JOIN 查询创建别名投影
Hibernate - Create alias projection for INNER JOIN query
(这是我的域的简化版本)
我有一个实体 Product
,它与 Connection
具有 1 对 N 的关系。映射工作正常,因此当我需要检索产品的连接时,我只需执行 product.getConnections();
.
我需要与遗留系统的 GUI 集成,这要求我生成此格式的列表:
|PRODUCT_ID|NAME|CONNECTION_ID|NAME|
|1|Product A|10|Connection A|
|1|Product A|11|Connection B|
|1|Product A|12|Connection C|
这基本上是这个查询的结果:
SELECT *
FROM Product P
INNER JOIN Connection C ON C.PRODUCT_ID = P.PRODUCT_ID
我想在 Product
实体上创建一个 属性 可以用连接名称填充的实体,以便我可以在我的服务上重用现有逻辑。我尝试使用 @Formula
但这不起作用。看起来我可以通过创建一个投影别名来实现这一点,但我没有成功。
我们使用 Hibernate 的 Criteria
和 Projection
API 来执行查询。
Criteria productCriteria = session.createCriteria(Product.class);
ProjectionList columns = Projections.projectionList();
columns.add(Projections.property("productId"));
columns.add(Projections.property("name"));
columns.add(Projections.property("connectionName")); // How to make this work?
productCriteria.setProjection(columns);
List<Product> prodList = productCriteria.list();
这些是我的实体:
class Product {
private Long productId;
private String name;
@OneToMany(mappedBy = "product")
private List<Connection> connections;
// How to get this populated?
@Transient
private String connectionName;
}
class Connection {
private Long connectionId;
@Column(name = "PRODUCT_ID")
private Long productId;
private String name;
@ManyToOne
@JoinColumn(name = "PRODUCT_ID", insertable = false, updatable = false)
private Product product;
}
想法是创建加入条件table;尝试类似的东西:
Criteria productCriteria = session.createCriteria(Product.class);
Criteria connectionCriteria = criteria.createCriteria("connections", "c", CriteriaSpecification.INNER_JOIN);
ProjectionList columns = Projections.projectionList();
columns.add(Projections.property("productId"));
columns.add(Projections.property("name"));
columns.add(Projections.property(connectionCriteria.getAlias() + ".connectionId"));
columns.add(Projections.property(connectionCriteria.getAlias() + ".name"));
productCriteria.setProjection(columns);
List<Product> prodList = productCriteria.list();
(这是我的域的简化版本)
我有一个实体 Product
,它与 Connection
具有 1 对 N 的关系。映射工作正常,因此当我需要检索产品的连接时,我只需执行 product.getConnections();
.
我需要与遗留系统的 GUI 集成,这要求我生成此格式的列表:
|PRODUCT_ID|NAME|CONNECTION_ID|NAME|
|1|Product A|10|Connection A|
|1|Product A|11|Connection B|
|1|Product A|12|Connection C|
这基本上是这个查询的结果:
SELECT *
FROM Product P
INNER JOIN Connection C ON C.PRODUCT_ID = P.PRODUCT_ID
我想在 Product
实体上创建一个 属性 可以用连接名称填充的实体,以便我可以在我的服务上重用现有逻辑。我尝试使用 @Formula
但这不起作用。看起来我可以通过创建一个投影别名来实现这一点,但我没有成功。
我们使用 Hibernate 的 Criteria
和 Projection
API 来执行查询。
Criteria productCriteria = session.createCriteria(Product.class);
ProjectionList columns = Projections.projectionList();
columns.add(Projections.property("productId"));
columns.add(Projections.property("name"));
columns.add(Projections.property("connectionName")); // How to make this work?
productCriteria.setProjection(columns);
List<Product> prodList = productCriteria.list();
这些是我的实体:
class Product {
private Long productId;
private String name;
@OneToMany(mappedBy = "product")
private List<Connection> connections;
// How to get this populated?
@Transient
private String connectionName;
}
class Connection {
private Long connectionId;
@Column(name = "PRODUCT_ID")
private Long productId;
private String name;
@ManyToOne
@JoinColumn(name = "PRODUCT_ID", insertable = false, updatable = false)
private Product product;
}
想法是创建加入条件table;尝试类似的东西:
Criteria productCriteria = session.createCriteria(Product.class);
Criteria connectionCriteria = criteria.createCriteria("connections", "c", CriteriaSpecification.INNER_JOIN);
ProjectionList columns = Projections.projectionList();
columns.add(Projections.property("productId"));
columns.add(Projections.property("name"));
columns.add(Projections.property(connectionCriteria.getAlias() + ".connectionId"));
columns.add(Projections.property(connectionCriteria.getAlias() + ".name"));
productCriteria.setProjection(columns);
List<Product> prodList = productCriteria.list();