1

如何加入额外的 ON 子句参数?我有一个 SQL:

select * from Address address left outer join  AddressLine line 
              on line.id = address.lineId AND line.type = 'MA'
where address.id = 1;

我有代码:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<AddressResult> query = cb.createQuery(AddressResult.class);
Root<Address> r = query.from(Address.class);
Join<Address, AddressLineMA >linesMA= r.join(Address_.linesMajor, JoinType.LEFT);

从数据库中获取数据。此查询未按预期工作我得到这样的 SQL:

select * from Address address left outer join  AddressLine line 
              on line.id = address.lineId 
    where address.id = 1;

AND line.type = 'MA'缺失。有人知道如何解决这个问题吗?

我的 AddressLineMA.class 看起来像这样:

@Entity
@DiscriminatorValue(value = "MA")
public class AddressLineMA extends AddressLine {

}
@Entity
@Table(name = "AddressLine")
@DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING)
public abstract class AddressLine {
   private Long id;
   private String type;
   private String line;
}
4

1 回答 1

4

默认情况下,JPA 查询始终返回所有子类。因此,如果您只需要 AddressLineMA 的实例,则必须将查询和关系更改为在 AddressLineMA 上,而不是在继承根类 AddressLine 上。

如果还有其他要排除的 AddressLineMA 子类,则可以使用 JPA 2.0 中添加的 TYPE 运算符:

   query.where(cb.equal(linesMA.type(), package.AddressLineMA.class));

不幸的是,仅在尚未发布的 JPA 2.1 规范中支持将其添加到 ON 子句中:

   linesMA.on(cb.equal(linesMA.type(), package.AddressLineMA.class));
于 2013-02-04T18:58:39.350 回答