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。
我正在处理 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。