【问题标题】:How to use @ConstructorResult annotation如何使用@ConstructorResult注解
【发布时间】:2014-05-05 00:04:28
【问题描述】:

我有一些本机查询,想将查询执行的结果映射到非实体 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 列表?

【问题讨论】:

标签: java jpa nativequery


【解决方案1】:

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

【讨论】:

  • 这没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
  • 我没有尝试过,但我相信它就是答案。我将其表述为“尝试”的事实与它的正确性无关。 PS:您可以肯定,如果我得到OP的任何反应,我会相应地更改文字。
  • 如果我将“@SqlResultSetMapping”注释移动到另一个实体类(带有“@Entity”注释)我收到空列表。但是在 HeidySQL 中执行相同的查询会返回多行。
【解决方案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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-06
    • 2020-12-13
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 2014-11-19
    相关资源
    最近更新 更多