为一种CrudRepository方法(findById)返回两种不同的数据类型

时间:2019-01-13 19:46:11

标签: spring spring-data

我正在使用CrudRepository。

在两种情况下我需要方法findById:

  1. EmailShort findById(Long id);
  2. EmailFull findById(Long id);

EmailShort和EmailFull是接口。

public interface EmailFull extends EmailCustom {
    Long getId();

    UserShort getSender();
    String getContent();
    String getTopic();
    String getShortContent();

    @JsonFormat
            (shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy HH:mm:ss")
    Date getCreationTime();
}

public interface EmailShort extends EmailCustom {
    Long getId();

    UserShort getSender();
    String getTopic();
    String getShortContent();
    boolean getIsRead();
    void setRead(boolean read);

    @JsonFormat
            (shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy HH:mm:ss")
    Date getCreationTime();
}

我的存储库:

@Repository
public interface EmailDao extends CrudRepository<Email, Long> {

    EmailShort findById(Long id);

    @Query("select e from email e where e.id=?1")
    EmailFull findFullById(@Param("id") Long id);

    @Query(value = "select * " +
            "from email " +
            "where email.id = :emailId", nativeQuery = true)
    EmailShort findByIdWithShortSenderInfo(@Param("emailId") long emailId);
}

我无法使用电子邮件对象,因为它包含具有地址等数据的用户(不需要)。

任何想法如何解决这个问题?可能,我应该更改实体定义吗?

2 个答案:

答案 0 :(得分:0)

您只需要使用其他名称即可。这与Spring Data完全无关。

Java根据方法的签名(名称和参数,不包括返回类型)决定方法的唯一性。

阅读covariancecontravariance以便更好地理解,此外:https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.2

答案 1 :(得分:0)