Return more data than model contains using Spring Data

佐手、 提交于 2020-01-14 04:31:16

问题


I'm working with Spring Data which is great stuff, but sometimes I need to get more data from database than my model can handle. For example I have model like below.

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

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

    @Getter
    @Setter
    private String text;
}

An I my query will be more complex than usual. I want to get my model and in addition number of similar entities, using group by.

@Query(value = "SELECT m, COUNT(m) as countValue FROM Mail m GROUP BY m.text")
List<Mail> findAllNewsletters();

How I should handle something like that? My model does't contain countValue so I will get List<Object[]>

How to deal with that situation, keep my code clean, easiness of using this.


回答1:


Step 1: Create a container class to hold the output from your query.

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; }
}

Step 2: Populate and return instances of the container class from the query.

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

For full details, see the JPA specification.




回答2:


You can go for a DTO like following

    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;
    }
}

and inside your business logic you can take the advantage of spring template something like following

@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;
 }

Hope this help.



来源:https://stackoverflow.com/questions/34441163/return-more-data-than-model-contains-using-spring-data

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!