Java Spring数据-规范与层次结构连接

Java Spring数据-规范与层次结构连接,java,hibernate,spring-data,Java,Hibernate,Spring Data,我在一个规范中遇到了问题,我试图在两个类之间进行左连接,这两个类是两个抽象类的子类 我有这样的层次结构: @Entity @Table(name = "product") public abstract class Product { @Id @SequenceGenerator(name = "product_seq", sequenceName = "product_seq", allocationSize = 1) @GeneratedValue(strategy = Gene

我在一个规范中遇到了问题,我试图在两个类之间进行左连接,这两个类是两个抽象类的子类

我有这样的层次结构:

@Entity
@Table(name = "product")
public abstract class Product {
  @Id
  @SequenceGenerator(name = "product_seq", sequenceName = "product_seq", allocationSize = 1)
  @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "product_seq")
  @Column(updatable = false)
  private Long id;
  private String name;
  private String brand;
}
@Entity
@Table(name = "offer")
public abstract class Offer {

  @ManyToOne(fetch = FetchType.EAGER)
  @JoinColumn(name="PRODUCT_ID")
  private Product product;
  ...
}
@Override
public Predicate toPredicate(Root<FridgeOffer> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {

    Join<FridgeOffer, Fridge> join = root.join("product", JoinType.LEFT);
    Path<String> expression = join.get(searchCriteria.getKey());
    ...
}

此外,我还有其他类似的课程:

@Entity
@Table(name = "product")
public abstract class Product {
  @Id
  @SequenceGenerator(name = "product_seq", sequenceName = "product_seq", allocationSize = 1)
  @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "product_seq")
  @Column(updatable = false)
  private Long id;
  private String name;
  private String brand;
}
@Entity
@Table(name = "offer")
public abstract class Offer {

  @ManyToOne(fetch = FetchType.EAGER)
  @JoinColumn(name="PRODUCT_ID")
  private Product product;
  ...
}
@Override
public Predicate toPredicate(Root<FridgeOffer> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {

    Join<FridgeOffer, Fridge> join = root.join("product", JoinType.LEFT);
    Path<String> expression = join.get(searchCriteria.getKey());
    ...
}

在我的规范中,我有如下代码:

@Entity
@Table(name = "product")
public abstract class Product {
  @Id
  @SequenceGenerator(name = "product_seq", sequenceName = "product_seq", allocationSize = 1)
  @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "product_seq")
  @Column(updatable = false)
  private Long id;
  private String name;
  private String brand;
}
@Entity
@Table(name = "offer")
public abstract class Offer {

  @ManyToOne(fetch = FetchType.EAGER)
  @JoinColumn(name="PRODUCT_ID")
  private Product product;
  ...
}
@Override
public Predicate toPredicate(Root<FridgeOffer> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {

    Join<FridgeOffer, Fridge> join = root.join("product", JoinType.LEFT);
    Path<String> expression = join.get(searchCriteria.getKey());
    ...
}

我尝试使用其他_字段(列的名称),但我有相同的问题。消息中最离谱的部分是hibernate似乎在Product类中进行查找,而不是我在规范中选择的Fridge。如果我尝试使用产品中定义的列,一切都正常。我做错了什么

我想问题是,
FridgeOffer
有两个同名的属性
product
,因为私有字段不会过载,它们彼此隐藏。不确定Hibernate或Spring数据如何处理,也不确定它们实际上应该如何处理。所以问题变成了,这个重复定义的目的是什么?类型安全?覆盖JPA注释?为了解决这个问题,我建议去掉其中一个字段或给它起不同的名字来解决这个问题。谢谢!这就是解决方案,我把产品换成了冰箱,效果很好。关于你的问题,这个设计的目的是重用代码,因为我有几个类似的微服务,它们有几乎相同的字段,所以我只想在每个字段中定义特定的字段,对公共属性使用继承。此外,我有许多服务和存储库将具有相同的行为,因此,我可能应该使用Java泛型进行一些设计,以避免这种混乱的代码。我想问题是,该
FridgeOffer
具有两个同名的属性
product
,因为私有字段不会重载,它们彼此隐藏。不确定Hibernate或Spring数据如何处理,也不确定它们实际上应该如何处理。所以问题变成了,这个重复定义的目的是什么?类型安全?覆盖JPA注释?为了解决这个问题,我建议去掉其中一个字段或给它起不同的名字来解决这个问题。谢谢!这就是解决方案,我把产品换成了冰箱,效果很好。关于你的问题,这个设计的目的是重用代码,因为我有几个类似的微服务,它们有几乎相同的字段,所以我只想在每个字段中定义特定的字段,对公共属性使用继承。此外,我有许多具有相同行为的服务和存储库,因此,我有可能改变为使用Java泛型的设计,以避免这种混乱的代码。