(Это упрощенная версия моего домена)
У меня есть объект Product
, который имеет отношение 1-N к Connection
.Сопоставление работает правильно, поэтому, когда мне нужно получить соединения для продукта, я просто делаю product.getConnections();
.
. Мне нужно интегрироваться с графическим интерфейсом устаревшей системы, который требует, чтобы я создал список в этом формате:
|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
, но это не работает.Похоже, что я могу добиться этого, создав псевдоним Projection, но я не добился успеха.
Мы используем API-интерфейсы Criteria
и Projection
Hibernate для выполнения запроса.
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;
}