英文:
SqlResultSetMapping not found
问题
I use spring boot 3. I try to create a native query with entity manager, i would like to feed a dto
@SqlResultSetMapping(
        name = "BookResultMapping",
        classes = @ConstructorResult(
                targetClass = BookSearchResult.class,
                columns = {
                        @ColumnResult(name = "code"),
                        @ColumnResult(name = "title")}))
public class BookSearchService {
    @PersistenceContext
    private EntityManager entityManager;
    public void bookSearch(Search search){
         StringBuilder sbSqlQuery = new StringBuilder();
         ...
         Query query = entityManager.createNativeQuery(sbSqlQuery.toString(), "BookResultMapping");
         ...
    }
}
@Data
@RequiredArgsConstructor
public class BookSearchResult {
    private String code;
    private String title;
}
When i run this code, I get
Could not resolve specified result-set mapping name : BookResultMapping
Edit, I tried to but code related to SqlResultSetMapping directly to the dto, but i get same result
英文:
I use spring boot 3. I try to create a native query with entity manager, i would like to feed a dto
@SqlResultSetMapping(
        name = "BookResultMapping",
        classes = @ConstructorResult(
                targetClass = BookSearchResult.class,
                columns = {
                        @ColumnResult(name = "code"),
                        @ColumnResult(name = "title")}))
public class BookSearchService {
    @PersistenceContext
    private EntityManager entityManager;
    public void bookSearch(Search search){
         StringBuilder sbSqlQuery = new StringBuilder();
         ...
         Query query = entityManager.createNativeQuery(sbSqlQuery.toString(), "BookResultMapping");
         ...
    }
}
@Data
@RequiredArgsConstructor
public class BookSearchResult {
    private String code;
    private String title;
}
When i run this code, I get
> Could not resolve specified result-set mapping name : BookResultMapping
Edit, I tried to but code related to SqlResultSetMapping directly to the dto, but i get same result
答案1
得分: 1
请查看这个其他答案:https://stackoverflow.com/a/36109273
简而言之,@SqlResultSetMapping 注解应该放在你的 @Entity 类中的一个以便被检测到。我认为这个文档编写得不够好,在线示例总是展示孤立的注解,缺乏上下文信息。
如果你想避免使用任何实体,你可以像这样做:
@SqlResultSetMapping(
    name = "MessageDTO",
    classes = @ConstructorResult(targetClass = MessageDTO.class, columns = {
        @ColumnResult(name = "message_body", type = String.class),
        @ColumnResult(name = "created_date", type = OffsetDateTime.class)
    })
)
@Embeddable
public static class SQLMappingConfigEntity {
    /* 这个虚拟的 Embeddable 类允许 SqlResultSetMapping 注解被识别 */
}
在这个示例中,MessageDTO 将是你的 DTO。它必须有一个包含所有参数的构造函数。
英文:
Check this other answer: https://stackoverflow.com/a/36109273
In short, the @SqlResultSetMapping annotation should go in one of your @Entity classes in order to be detected.  I think this is poorly documented and online examples always show the isolated annotation without much context.
If you wanted to avoid using any entity, you can so something like:
@SqlResultSetMapping(
		name = "MessageDTO",
		classes = @ConstructorResult(targetClass = MessageDTO.class, columns = {
				@ColumnResult(name = "message_body", type = String.class),
				@ColumnResult(name = "created_date", type = OffsetDateTime.class)
		})
)
@Embeddable
public static class SQLMappingConfigEntity {
	/* this dummy Embeddable class allows SqlResultSetMapping annotation to be picked up */
}
In this example, MessageDTO would be your DTO. It must have with a constructor will all arguments.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论