【问题标题】:How to use "findBy" in an Entity with a Composite PK (Hibernate JPA)如何在具有复合 PK(Hibernate JPA)的实体中使用“findBy”
【发布时间】:2016-05-05 09:48:25
【问题描述】:

我正在学习 bootspring。

findByDate(int date); 过去一直工作,直到我将 int Date 移到内部类中。

现在我可以保存新条目,但无法按日期检索它们

我需要改变什么?

@Transactional
public interface ExpirationDAO extends JpaRepository<ExpirationDTO, Long> {

    public ExpirationDTO findByDate(int date);
}

@Embeddable
    public static class IdKey implements Serializable{
        @NotNull
        int date;
        @ManyToOne
        ProductDTO product;

        public IdKey(){
        }
         //setters and getters
    }
    @EmbeddedId
    private IdKey id;
    @NotNull
    int units;

    public ExpirationDTO(){     
    }
       //setters and getters
}

抛出此异常:

org.springframework.data.mapping.PropertyReferenceException: No property date found for type ExpirationDTO!

【问题讨论】:

  • 您的数据库中的日期是哪种属性?因为你有findByDate(String date) 和一个字符串,在IdKey 中作为int。你有什么例外吗?您能否更具体地说明什么不起作用。
  • 你是对的。它应该是 int 而不是 String 但我不是问题。那个错误很好用。例外是:org.springframework.data.mapping.PropertyReferenceException: No property date found for type ExpirationDTO!
  • int Date 添加到您的ExpirationDTO 因为您的findByDate 会返回一个ExpirationDTO 对象。
  • 不起作用抛出:org.hibernate.MappingException: Repeated column in mapping for entity: app.model.data.ExpirationDTO column: date (should be mapped with insert="false" update="false"),因为日期在复合键中重复。
  • 如果将insert="false" update="false" 添加到日期列会发生什么?

标签: java spring hibernate jpa spring-data-jpa


【解决方案1】:

您应该在存储库中包含嵌入式密钥类的名称,而不是 Long。 试试这个(未测试):

public interface ExpirationDAO extends JpaRepository<ExpirationDTO, IdKey> {
    public List<ExpirationDTO> findByIdDate(int date);
}

findBy 之后的 Id 是你的 EmbeddedIdDate 是可嵌入类的属性。还有一件事:如果你只使用嵌入密钥的一部分,你不能期望只有一个结果......

【讨论】:

  • 谢谢! findByIdDate(int date);作品!是的,我不指望一个结果。现在我认为它应该是多对多的关系。很多产品有很多保质期,很多保质期有不同的产品。还有@Patrick,也感谢您的宝贵时间。
  • 如果您想要搜索的组合键的一部分不止一个,可以将它们连接在一起,例如 findByIdDateIdFooIdBar 来源:kevinmichaelcoy.com/blog/2021/02/25/…
【解决方案2】:

您应该在存储库中包含嵌入式密钥类的名称并添加下划线 (_)

测试如下:

public interface ExpirationDAO extends JpaRepository<ExpirationDTO, IdKey> {
    public List<ExpirationDTO> findByIdKey_Date(Date date);
}

【讨论】:

  • 由于字段在ExpirationDTO类中被命名为“Id”,所以方法应该是findById...,而不是findByIdKey...
猜你喜欢
  • 2020-06-22
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
相关资源
最近更新 更多