【问题标题】:JpaRepository findOne(id) returns nullJpaRepository findOne(id) 返回 null
【发布时间】:2015-04-13 08:55:15
【问题描述】:

这是我在这里的第一篇文章,我在这里搜索了很长时间,但我没有发现一个看起来相似的问题。

当我对我的一个类使用 JpaRepository 函数 findOne(id) 时,它返回 null。好像没有找到该 id 的行。 当然存在这个id的数据库行。

我的类映射也似乎正确。

我不明白,因为我已经将 findOne() 用于其他类,而且我从来没有遇到任何问题。

谁能告诉我这个问题的根源是什么?那就太好了!

这是我的 DAO:

@Transactional
public interface OrderDetailDAO extends JpaRepository<OrderDetail, Integer>
{
}

这是我的模特:

@Entity
@Table(name = "order_detail", schema = "", catalog = AppConfig.databaseSchema)
public class OrderDetail implements Serializable {
private int idOrderDetail;
private Order order;
private Preorder preorder;
private UnitType unitType;
private Sale sale;
private DeliveryStatusType deliveryStatusType;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_Order_Detail")
public int getIdOrderDetail() {
    return idOrderDetail;
}
public void setIdOrderDetail(int idOrderDetail) {
    this.idOrderDetail = idOrderDetail;
}
@ManyToOne
@JoinColumn(name = "id_Order", referencedColumnName = "id_Order", nullable = false)
public Order getOrder() {
    return order;
}
public void setOrder(Order order) {
    this.order = order;
}
@ManyToOne
@JoinColumn(name = "id_Preorder", referencedColumnName = "id_Preorder", nullable = false)
public Preorder getPreorder() {
    return preorder;
}
public void setPreorder(Preorder preorder) {
    this.preorder = preorder;
}
@ManyToOne
@JoinColumn(name = "id_Unit_Type", referencedColumnName = "id_Unit_Type")
public UnitType getUnitType() {
    return unitType;
}
public void setUnitType(UnitType unitType) {
    this.unitType = unitType;
}
@ManyToOne
@JoinColumn(name = "id_Sale", referencedColumnName = "id_Sale")
public Sale getSale() {
    return sale;
}
public void setSale(Sale sale) {
    this.sale = sale;
}
@ManyToOne
@JoinColumn(name = "id_Delivery_Status_Type", referencedColumnName = "id_Delivery_Status_Type")
public DeliveryStatusType getDeliveryStatusType() {
    return deliveryStatusType;
}
public void setDeliveryStatusType(DeliveryStatusType deliveryStatusType) {
    this.deliveryStatusType = deliveryStatusType;
}
}

当我手动编写请求时,像这样:

@Query("SELECT o FROM OrderDetail o WHERE o.idOrderDetail = :idOrderDetail")
public OrderDetail findOneCustom(@Param("idOrderDetail") Integer idOrderDetail);

这行得通,但这很难看,所以我更喜欢使用 JpaRepository 原生函数 findOne()

【问题讨论】:

  • 我们需要模式细节。能否提供部分代码?
  • 哇,你回答得很快,谢谢!我编辑了我的帖子
  • 我可能错了,但 idOrderDetail(+ 访问器)不应该是 Integer 而不是 int
  • 感谢您的回答 sp00m。事实上,我们可以使用 Integer 进行休眠映射,但在我的所有其他类中,我也使用 int 和 findOne() 工作。
  • 首先将 int 更改为 Integer,其次,在日志中检查 hibernate 在调用 findOne 方法时生成的查询。这可能是开始的好地方

标签: java spring hibernate spring-data-jpa


【解决方案1】:

经过所有调查,我找到了一个对我有用的有趣答案。我认为这完全是关于在 Db 上定义列类型。对于我的情况,我将变量(rid 作为列)定义为varchar2(18),即RID CHAR(18 BYTE)

Java部分:

if (dhFlightRepo.findOneFlight(dhFlight.getRid())== null) {       
    dhFlightRepo.save(dhFlight);
}

如果您用作findOne() 参数的值小于列上的设置值(在我的情况下为 18),则 jpa 不接受值并返回 null。您必须将列类型更改为 varchar2( 18)它可以根据findOne()上的给定值进行更改,并且工作完美。

我希望这对你们所有人都有效。如果有人知道更详细的原因,我恳请提供更多详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 2019-03-25
    • 2015-04-30
    • 2022-01-23
    • 2021-04-25
    • 1970-01-01
    • 2016-02-10
    相关资源
    最近更新 更多