[英]Hibernate - Create alias projection for INNER JOIN query
(This is a simplified version of my domain) (这是我的域的简化版本)
I have an entity Product
which has a 1-to-N relationship to Connection
. 我有一个实体Product
,它与Connection
具有1-to-N关系。 The mapping works correctly so that when I need to retrieve connections for a product I just do product.getConnections();
映射正常工作,因此当我需要检索产品的连接时,只需执行product.getConnections();
. 。
I need to integrate with a legacy system's GUI which requires that I produce a list on this format: 我需要与旧系统的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|
which is basically a result from this query: 这基本上是此查询的结果:
SELECT *
FROM Product P
INNER JOIN Connection C ON C.PRODUCT_ID = P.PRODUCT_ID
I would like to create a property on the Product
entity that could be populated with the connection's name so that I can reuse existing logic on my service. 我想在Product
实体上创建一个属性,该属性可以用连接的名称填充,以便可以重用服务上的现有逻辑。 I tried to use @Formula
but that does not work. 我尝试使用@Formula
但这不起作用。 It seems like I can achieve this by creating a Projection alias, but I was not successful at that. 看起来我可以通过创建Projection别名来实现这一点,但是我没有成功。
We use Hibernate's Criteria
and Projection
API to perform the query. 我们使用Hibernate的Criteria
and 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();
These are my entities: 这些是我的实体:
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;
}
The idead is to create criteria to join table; 想法是创建连接表的条件; try something like : 尝试类似的东西:
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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.