休眠-自定义查询未通过ManyToOne单向关系的子参数找到实体

时间:2018-08-09 05:23:53

标签: java hibernate jpa spring-data-jpa

使用子实体作为搜索参数来检索实体时遇到问题。实体以单向关系与多对一关系相关,每个对象都以FetchType.LAZY的形式获取。 当我通过子实体寻找实体时,结果为null。但是当我设置为“渴望”时,它是正确的。

我的实体:

@NoArgsConstructor
@Getter
@Entity
@Table(name = "partner")
public class PartnerEntity implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String login;
    public PartnerEntity(String login) {
        this.login = login;
    }
}


@NoArgsConstructor
@Getter
@Entity
@Table(name = "point")
public class PointEntity implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "partner_Id")
    private PartnerEntity partnerEntity;
    public PointEntity(PartnerEntity partnerEntity) {
        this.partnerEntity = partnerEntity;
    }
}

@NoArgsConstructor
@Getter
@Entity
@Table(name = "orer")
public class OrdEntity implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "PAYMENT_POINT_ID")
    private PointEntity pointEntity;
    public OrdEntity(PointEntity pointEntity) {
        this.pointEntity = pointEntity;
    }
}



@NoArgsConstructor
@ToString
@Getter
@Entity
@Table(name = "BL")
public class BLEntity implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "PARTNER_LOGIN", referencedColumnName = "login")
    private PartnerEntity partnerEntity;
    private String number;
    public BLEntity(PartnerEntity partnerEntity, String number) {
        this.partnerEntity = partnerEntity;
        this.number = number;
    }
}

然后我使用OrdEntity子级寻找BLEntity:

 final OrdEntity byId = ordRepo.findById(id);
 final PartnerEntity partnerEntity = order.getPointEntity().getPartnerEntity();
 final BLEntity blEntityResult= blRepo.findOneByNumberAndPartner(number, partnerEntity);

对象partnerEntity不为null,它是正确的对象。 我将blEntityResult设置为null,但如果将PointEntity fetch更改为FetchType.EAGER,则blEntityResult不为null(正确)。

我在以下存储库中的自定义查询:

public interface BLRepo extends JpaRepository<BLEntity, Long> {
@Query("select b from BLEntity b where b.number = :number and b.partnerEntity= :partner")
BLEntity findOneByNumberAndPartner(@Param("number") String number, @Param("partner") PartnerEntity partner);
}

如果正在下载的伙伴对象不是null且正确,为什么会发生?

2 个答案:

答案 0 :(得分:0)

我认为您应该在两侧都添加映射, 因为@ AllToMany = Lazy和@ManyToAll = Eager的默认访存类型。 只需在PartnerEntity中添加以下代码。

@OneToMany(mappedBy="partnerEntity" , fetch = FetchType.Eager )
 List<BLEntity> blEntity = new ArrayList<>();

答案 1 :(得分:0)

我将FetchType更改为PointEntity中的Eager:

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "partner_Id")
private PartnerEntity partnerEntity;

一切正常,但是我不明白为什么它不适用于PaymentType.Lazy。当我寻找时:

final PartnerEntity partnerEntity = order.getPointEntity().getPartnerEntity();

我得到正确的实体“ PartnerEntity”,该实体具有正确的登录字段(login'field的值为“ test”)。

当我将登录级别设置为“ TRACE”时,Hibernate没有绑定正确的登录参数,而是将其设置为null而不是“ test”)为什么? :)