有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用@ConstructorResult注释

我有一些本机查询,希望将查询执行的结果映射到非实体POJO类列表中:

@SqlResultSetMapping(
    name = "SomeMapping",
    classes = {
        @ConstructorResult(targetClass = SomeClass.class,
            columns = {
                @ColumnResult(name = "id", type = Integer.class),
                @ColumnResult(name = "NAME", type = String.class),
                @ColumnResult(name = "DATE_BEGIN", type = java.util.Date.class)
            }
        )
    }
)

public class SomeClass{
    private Integer id;
    private String name;
    private java.util.Date begDate;
    private java.util.Date endDate;

    public SomeClass(Integer id, String name, Date begDate){
        this.id = id;
        this.name = name;
        this.begDate = begDate;
    }

    //Getters & Setters ...
}

以及我想要检索查询执行结果的一般方式:

String query = "SELECT " +
"A.id AS 'id', " +
"A.name AS 'NAME', " +
"A.begDate AS 'DATE_BEGIN' " + 
"FROM " +
"SomeTable A " +
"WHERE A.endDate < '2014-01-01'";

List<SomeClass> result = em.createNativeQuery(query, "SomeMapping").getResultList();

但我总是能拿到物品清单。如何检索我的POJO-s列表


共 (2) 个答案

  1. # 1 楼答案

    尝试在实体上移动@SqlResultSetMapping实体

  2. # 2 楼答案

    无法复制,但您的代码有一些问题

    • 在实体类上添加@SqlResultSetMapping
    • 不要用'引用列别名
    import java.util.Date;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    public class SomeClass {
        private int id;
        private String name;
        private Date dateBegin;
    }
    
    import java.util.Date;
    import javax.persistence.Column;
    import javax.persistence.ColumnResult;
    import javax.persistence.ConstructorResult;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.SqlResultSetMapping;
    import javax.persistence.Table;
    import lombok.Getter;
    
    @SqlResultSetMapping(
        name = "SomeMapping",
        classes = {
            @ConstructorResult(targetClass = SomeClass.class,
                columns = {
                    @ColumnResult(name = "id", type = Integer.class),
                    @ColumnResult(name = "NAME", type = String.class),
                    @ColumnResult(name = "DATE_BEGIN", type = java.util.Date.class)
                })
        })
    @Entity
    @Table(name = "sometable")
    @Getter
    public class SomeEntity {
    
        @Id
        @Column(name = "id")
        private Integer id;
    
        @Column(name = "name")
        private String name;
    
        @Column(name = "begdate")
        private Date begDate;
    
        @Column(name = "enddate")
        private Date endDate;
    }
    
            final String query = "SELECT " +
                "A.id AS id, " +
                "A.name AS NAME, " +
                "A.begDate AS DATE_BEGIN " +
                "FROM " +
                "SomeTable A " +
                "WHERE A.endDate < '2014-01-01'";
    
            final List<SomeClass> result = em.createNativeQuery(query, "SomeMapping").getResultList();