Return 使用 Spring 数据比模型包含的数据多

Return more data than model contains using Spring Data

我正在处理 Spring 数据,这是很棒的东西,但有时我需要从数据库中获取比我的模型可以处理的更多的数据。例如我有如下模型。

@Entity
@Table(name = "email")
public class Mail implements Serializable {

    @Getter
    @Setter
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    private Long id;

    @Getter
    @Setter
    private String text;
}

我的查询会比平时更复杂。我想使用 group by.

获取我的模型以及其他类似实体的数量
@Query(value = "SELECT m, COUNT(m) as countValue FROM Mail m GROUP BY m.text")
List<Mail> findAllNewsletters();

我应该如何处理这样的事情?我的模型不包含 countValue 所以我会得到 List<Object[]>

如何处理这种情况,保持我的代码干净、简单 使用这个。

你可以像下面这样使用 DTO

    public class MailEntry {

    private Long id;
    private String text;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}

在您的业务逻辑中,您可以利用 spring 模板,例如以下内容

@Autowired
JdbcTemplate jdbcTemplate;

private static final String SQL = "SELECT m, COUNT(m) as countValue FROM Mail m GROUP BY m.text";

public List<MailEntry> getMailEntries() {
List<MailEntry> mailEntryList = jdbcTemplate.query(SQL, new RowMapper<MailEntry>() {
        public MailEntry mapRow(ResultSet rs, int rowNum) throws SQLException {
            MailEntry mailEntry = new MailEntry();
            mailEntry.setId(rs.getInt(1));
            mailEntry.setText(rs.getString(2));
            return mailEntry;
        }
     });
     return mailEntryList;
 }

希望对您有所帮助。

第 1 步:创建一个容器class 来保存查询的输出。

class MailOccurence {
  private final Mail mail;
  private final Long recurrence;

  public MailOccurence(final Mail mail, final Long recurrence) {
    this.mail = mail;
    this.recurrence = recurrence;
  }

  public Mail getMail() { return mail; }
  public Long getRecurrence() { return recurrence; }
}

步骤 2:从查询中填充和 return 容器 class 的实例。

Query(value = "SELECT new MailOccurence(m, COUNT(m)) FROM Mail m GROUP BY m.text")
List<MailGroup> findAllNewsletters();

有关完整详细信息,请参阅 JPA specification