在多列上使用投影 - 连接表

Posted

技术标签:

【中文标题】在多列上使用投影 - 连接表【英文标题】:using projections on multiple columns - joined tables 【发布时间】:2014-10-03 21:45:15 【问题描述】:

美好的一天。

所以我有映射 @ID @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "discount_fares_id_sequence") @SequenceGenerator( name = "discount_fares_id_sequence", sequenceName = "discount_fares_id_seq", 分配大小 = 1 ) 私有长id;

@Column
private Long discount;

@Column(name = "fare_code", length = 255)
private String fareCode;

@ManyToOne
@JoinColumn(name = "aircompany_id", foreignKey = @ForeignKey(name = "fk_discfares_ref_aircompany_id"))
private AircompanyRB aircompanyId;

我如何使用投影来仅提取

折扣票价编号 折扣 票价代码 和 aircompany_id(AircompanyRB 的键)

所以基本上 DiscountFares 的所有字段加上 AircompanyRB 的唯一键?

我试过了

    DetachedCriteria criteria = DetachedCriteria.forClass(DiscountFares.class)
        .createCriteria("aircompanyId")
        .setProjection(Projections.projectionList()
        .add(Projections.property("id"))
        .add(Projections.property("discount"))
        .add(Projections.property("fareCode")));

    List<DiscountFares> result = criteria.getExecutableCriteria(sessionFactory.getCurrentSession()).list();

但它抛出异常说 AircompanyRB 没有字段“折扣” (是的,它没有 - DiscountFares)

非常感谢! 非常感谢任何帮助

【问题讨论】:

【参考方案1】:

首先,使用 Criteria 查询而不是死的简单 HQL 查询会让您的生活变得困难:

select df.id, df.discount, df.fareCode, ac.id 
from DiscountFares df
left join df.aircompanyId ac

现在,如果你真的想使用 Criteria,只需翻译上面的查询:

Criteria c = session.createCriteria(DiscountFares.class, "df");
c.createAlias("df.aircompanyId", "ac", JoinType.LEFT_OUTER_JOIN);
c.setProjection(Projections.projectionList()
    .add(Projections.property("df.id"))
    .add(Projections.property("df.discount"))
    .add(Projections.property("df.fareCode"))
    .add(Projections.property("ac.id")));

【讨论】:

谢谢你,太棒了,但我需要一个对象 DiscountFare, 然后使用select df, ad.id from from DiscountFares df ...

以上是关于在多列上使用投影 - 连接表的主要内容,如果未能解决你的问题,请参考以下文章

在多列上组合 sql 内部和外部联接

使用右表上的总和分组对多列进行 SQL 连接

如何在 SQL 中通过多列连接两个表?

在多列上检查约束

Laravel 多列上的多对多同步()

c# 如何将多个单行多列的datatable合并成一个单行多列的datatable,表中内容是string..