Java Hibernate:@ManyToOne(fetch=FetchType.LAZY)对非主键引用的列不起作用

Java Hibernate:@ManyToOne(fetch=FetchType.LAZY)对非主键引用的列不起作用,java,hibernate,jpa,lazy-loading,one-to-one,Java,Hibernate,Jpa,Lazy Loading,One To One,我有两个表:Order[OrderId(PK),OrderShipmentCode,…]和ShipmentId(PK),ShipmentCode,…] 在Order类中,我声明shipping字段如下: @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "OrderShipmentCode", referencedColumnName = "ShipmentCode", insertable = false, updatable = fa

我有两个表:
Order[OrderId(PK),OrderShipmentCode,…]
ShipmentId(PK),ShipmentCode,…]

Order
类中,我声明
shipping
字段如下:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "OrderShipmentCode", referencedColumnName = "ShipmentCode", insertable = false, updatable = false, nullable = false)
private Shipment shipment;
当我得到
订单
列表时,
发货
也被加载(我看到了许多单独的SELECT查询)。但是我希望
发货
是延迟加载的,而不是与
订单
一起提取

对于其他表,如果引用的列是主键,则结果与预期一致(使用延迟加载)。在我的例子中,
ShipmentCode
不是
shipping
表的主键,Hibernate不使用延迟加载

你能告诉我如何实现这个目标吗

编辑: 查询代码如下:

Criteria criteria = HibernateUtil.getSessionFactory().getCurrentSession().createCriteria(Order.class);
List result = criteria.list();

SQL查询是:1个SELECT语句用于
订单
表,一组SELECT语句用于
装运
问题是由

本着OSS的真正精神,您可能希望调查问题并发送一个包含修复建议的Pull请求。这是解决问题的最快方法。

试试以下方法:

Criteria criteria = HibernateUtil.getSessionFactory()
                                 .getCurrentSession()
                                 .createCriteria(Order.class)
                                 .setFetchMode("shipment", FetchMode.LAZY);

您可以在订单的装运字段上使用
@JsonIgnore
。如果您正在使用
MappedBy
over shipping字段进行发送,那么删除它可能会解决您的问题

使用shipmentCode添加到实体字段,并为关系设置代码,这样就可以了

@Column(name = "shipmentCode")
private Long shipmentCode;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "OrderShipmentCode", referencedColumnName = "shipmentCode", insertable = false, updatable = false, nullable = false)
private Shipment shipment;

如果您使用Lazy init进行实体提取,而不使用关系值fild,那么当您尝试提取Lazy实体时,Hibernate找不到任何值,因为它没有关系值

如果您在加载时担心多个select查询,您可以通过使用实体图来克服这一问题。请参考以下链接了解更多详细信息

能否显示被激发的条件或查询的代码?您可以尝试使用本机查询,如select*from order where condition。谢谢。我已经尝试了你的解决方案,但结果是sameI也用你更新的答案进行了测试,但结果仍然是一样的。我同意这一点。查看此帖子了解更多详细信息()请为您的解决方案添加解释