实际上我们正在使用fetchInto()将结果转换为对象列表.
例如:
Employee pojo匹配数据库表是员工.
List<Employee> employeeList = sql.select(Tables.Employee)
.from(Tables.EMPLOYEE).fetchInto(Employee.class);
Run Code Online (Sandbox Code Playgroud)
同样,我们如何转换我们使用连接获取的记录?
例如:
Customerpojo匹配数据库表是customer.
Employeepojo匹配数据库表是employee.
sql.select(<<IWantAllFields>>).from(Tables.CUSTOMER)
.join(Tables.EMPLOYEE)
.on(Tables.EMPLOYEE.ID.equal(Tables.CUSTOMER.EMPLOYEE_ID))
.fetchInto(?);
Run Code Online (Sandbox Code Playgroud) 我正在开发一个项目,我需要从层次结构Map<String, Object>中映射,其中第二个参数应该是a String或Map<String, Object>.到目前为止,ModelMapper工作得很棒,但我遇到了特定转换的问题.鉴于以下内容,其中Model只是一个标记界面:
class Client implements Model {
String firstName;
String lastName;
List<Organization> organizations = new ArrayList<>();
}
Run Code Online (Sandbox Code Playgroud)
假设Organization实现了我的标记界面,Model但是任意结构,我希望能够将以下内容映射到Client:
Map source = new HashMap(){{
put("firstName", "John"),
put("lastName", "Smith"),
put("organizations", new HashMap(){{
put("0", new HashMap(){{
put("id", "1234");
}});
put("abc", new HashMap(){{
put("id", "5678");
}});
}});
}};
Run Code Online (Sandbox Code Playgroud)
总结:在推入组织属性时,我如何让ModelMapper删除映射键并仅使用值列表?如果做不到这一点,组织的财产就会变空.你可能认为我有充分的理由希望这样做,而且是一个糟糕的例子!
提前感谢您的意见!
编辑
我试图建立一个Converter将管理从转换Map到Collection<Model>无果.鉴于:
new Converter<Map, Collection<DataTransportObject>>() {
@Override
public Set convert(MappingContext<Map, Collection<DataTransportObject>> context) { …Run Code Online (Sandbox Code Playgroud) 我有一个Student对象扩展Person对象.
public abstract class Person implements IIdentifiable {
private String contactNumber;
// other properties
public String getContactNumber() {
return contactNumber;
}
public void setContactNumber(String contactNumber) {
this.contactNumber = contactNumber;
}
}
public class Student extends Person {
private String studentNumber;
//Other properties
public String getStudentNumber() {
return studentNumber;
}
public void setStudentNumber(String studentNumber) {
this.studentNumber = studentNumber;
}
}
Run Code Online (Sandbox Code Playgroud)
学生有财产studentNumber,人有财产contactNumber.当我将Student对象映射到StudentDto它时,会对给定的属性感到困惑.
public class StudentDto{
private String studentNumber;
public String getStudentNumber() { …Run Code Online (Sandbox Code Playgroud) 我的DTO具有String格式的日期字段.我的实体的日期为LocalDate.目前我正在从地图中跳过它,然后手动显式设置它(String to Date,反之亦然).
可以自动转换吗?我在Spring bean中尝试了Converter但是它给了我很多编译错误(类型转换器不接受参数,不会覆盖转换方法 - 转换()也有很多错误).
@Bean
public ModelMapper studentModelMapper() {
....
Converter<String, LocalDate> toStringDate = new AbstractConverter<String, LocalDate>() {
protected String convert(String source) {
return source == null ? null : new LocalDate(source);
}
};
....
}
Run Code Online (Sandbox Code Playgroud)
我对modelmapper不太熟悉.任何帮助是极大的赞赏.
正如建议我尝试使用LocalDate for DTO,但问题是当我在前面发送此实体(REST调用)时,我得到了JSON.
"dateOfBirth": {
"year": 1972,
"month": "JANUARY",
"monthValue": 1,
"dayOfMonth": 4,
"dayOfWeek": "TUESDAY",
"era": "CE",
"dayOfYear": 4,
"leapYear": true,
"chronology": {
"id": "ISO",
"calendarType": "iso8601"
}
}
Run Code Online (Sandbox Code Playgroud)
我的前端开发人员需要"YYYY-MM-DD".
我正在使用 mongodb,所以我将实体与创建 DTO(使用休眠验证器注释)的表示层分离。
public abstract class UserDTO {
private String id;
@NotNull
protected String firstName;
@NotNull
protected String lastName;
protected UserType type;
protected ContactInfoDTO contact;
protected List<ResumeDTO> resumes;
public UserDTO(){}
//...
Run Code Online (Sandbox Code Playgroud)
我正在尝试从 db 这个具体的类中检索
public class UserType1DTO extends UserDTO {
private CompanyDTO company;
public UserType1DTO(){
super();
}
public UserType1DTO(String firstName, String lastName, ContactInfoDTO contact, CompanyDTO company) {
super(UserType.type1, firstName, lastName, contact);
this.company = company;
}
/...
Run Code Online (Sandbox Code Playgroud)
像这样:
return mapper.map((UserType1) entity,UserType1DTO.class);
Run Code Online (Sandbox Code Playgroud)
我收到关于无法实例化的错误 ResumeDTO
Failed to instantiate instance of destination *.dto.ResumeDTO. Ensure …Run Code Online (Sandbox Code Playgroud) 如何将多个字段映射/合并到一个字段中?就像连接一firstname和lastname到目的地fullname?
public class ModelMapperConfigTest {
@Test
public void should_validate() {
new ModelMapperConfig().modelMapper().validate();
}
@Data
public static class Person {
private String firstname;
private String lastname;
}
@Data
public static class PersonDto {
private String firstname;
private String lastname;
private String fullname;
}
// Test data
@Test
public void should_map_multiple_fields_into_one() {
ModelMapper modelMapper = new ModelMapper();
modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
// TODO: Configure modelmapper to merge the two fields
// test that all fields are mapped
modelMapper.validate();
// …Run Code Online (Sandbox Code Playgroud) 我正在使用Spring MVC框架编写简单的博客Web应用程序。我愿意DTO在我的应用程序中添加图层。
我决定使用ModelMapper框架从Entity对象转换为DTO视图中使用的对象。
我只有一个问题。在我的主页上,我正在显示博客中的帖子列表。在我看来,这只是Post(实体)对象的列表。我想更改它以将PostDTO对象列表传递给我的视图。有没有什么办法来映射List的Post对象List的PostDTO单方法调用的对象?我当时正在考虑编写将转换该转换器的转换器,但是我不确定这是否是一个好方法。
另外,我还在其他几个地方使用Lists,Entities例如管理面板或页面上每个帖子下方的评论。
public class SimpleDTO{
private String firstElement;
private String lastElement;
}
public class ComplexSource{
private List<String> elementList;
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用映射它,map().setFirstElement(source.getElementList().get(0))但收到错误消息“1) 无效的源方法 java.util.List.get()。确保该方法有零个参数并且不返回 void。”
如何使用 ModelMapper 或任何其他替代方案将列表中的元素映射到 Pojo 中的字段?
目前我们在我们的项目中使用 ModelMapper。然而,在该站点中,我看到 MapStruct 有很多人喜欢。
不确定差异以及我们是否真的需要升级。
ModelMapper 和 MapStruct 之间有什么区别?
谢谢。
如何在运行时使用ASM读取 Java 方法注释的值?
注释只有一个CLASS RetentionPolicy,因此不可能使用反射来做到这一点。
| 策略CLASS:注释将由编译器记录在类文件中,但不需要在运行时由VM保留
示例:我想在运行时从字段中
提取值:Carly Rae Jepsenartist
public class SampleClass {
@MyAnnotation(artist = "Carly Rae Jepsen")
public void callMeMaybe(){}
}
Run Code Online (Sandbox Code Playgroud)
@Documented
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
String artist() default "";
}
Run Code Online (Sandbox Code Playgroud)
但为什么?
难道你不能只改变RetentionPolicytoRUNTIME并用反射来做吗?
简而言之:不。我使用modelmapper框架(简单、智能、对象映射)。在那里,我通过带注释的方法指定了 Java 类之间的双向映射。我不想重用此分层映射信息来进行更改事件传播。但提供的mapstruct org.mapstruct.Mapping注解有CLASS RetentionPolicy. 这就是为什么我需要从类文件中读取该信息 - 并且需要ASM。
modelmapper ×10
java ×8
annotations ×1
dto ×1
jooq ×1
mapping ×1
mapstruct ×1
mongodb ×1
reflection ×1
spring ×1
sql ×1