Hibernate - создайте проекцию псевдонима для запроса INNER JOIN - PullRequest
0 голосов
/ 25 мая 2018

(Это упрощенная версия моего домена)

У меня есть объект 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;

}

1 Ответ

0 голосов
/ 28 мая 2018

Идея состоит в том, чтобы создать критерии для присоединения к таблице;попробуйте что-то вроде:

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();
...