【问题标题】:Hibernate - Create alias projection for INNER JOIN queryHibernate - 为 INNER JOIN 查询创建别名投影
【发布时间】:2018-05-25 16:45:13
【问题描述】:

(这是我的域的简化版本)

我有一个实体Product,它与Connection 具有一对多的关系。映射工作正常,因此当我需要检索产品的连接时,我只需执行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,但这不起作用。似乎我可以通过创建一个 Projection 别名来实现这一点,但我没有成功。

我们使用 Hibernate 的 CriteriaProjection 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;

}

【问题讨论】:

    标签: java hibernate spring-data spring-data-jpa hibernate-criteria


    【解决方案1】:

    想法是创建连接表的条件;尝试类似:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      • 2013-07-13
      • 2020-09-19
      • 1970-01-01
      • 2013-08-25
      • 2012-07-22
      • 2014-10-19
      相关资源
      最近更新 更多