JPA:有没有办法运行只访问几列的简单SELECT语句?

时间:2011-12-06 20:52:01

标签: java jpa jdbc

我是JPA的新手,请原谅我,如果我的问题看起来很愚蠢。

我们在项目中使用了JPA。我看到每个实体对象都有一个与表的直接映射,表中的每一行都是该实体类型的对象。

但是,假设我只想访问一个表的一列或两列,我该怎么做呢?我问的原因是因为我手头的任务。

有两张桌子。第一个表包含使用JPA设置的所有内容,以便每行可以转换为对象类型。第一个表有一个在第二个表中引用的列,即表A有列CLOTH_ID,表B有列CLOTH_IDCLOTH_DESCRIPTION。表CLOTH_IDA中均使用B;但B的{​​{1}}列对应CLOTH_DESCRIPTION

我在我的网页中显示了表格CLOTH_ID,但我还需要在我的网页中显示:A。是否有以JPA为导向的方法来执行此操作,或者我最好使用常规JDBC来提取CLOTH_DESCRIPTION值?

1 个答案:

答案 0 :(得分:4)

我假设你有以下设置:

@Entity
@Table(name="A")
class A {

    @ManyToOne
    @JoinColumn(name="CLOTH_ID")
    private B cloth;

    //...

}

@Entity
@Table(name="B")
class B {
    @Id
    @Column(name="CLOTH_ID")
    private int id;

    @Column(name="CLOTH_DESCRIPTION")
    private String description;

    //...
}

如果你没有......你做错了(即它不是惯用的JPA用法)。您有以下选择:

只需抓取A

在这种情况下,默认情况下也会急切地提取@ManyToOne关系。然后简单地用Java调用:

a.getCloth().getDescription()

除非B中的列数巨大,否则更喜欢这种方法,因为它是最简单和最惯用的。

对自定义列使用JPA查询:

SELECT a, a.b.description
FROM A a
WHERE a.id = :id

在这种情况下,查询返回List<Object[]>,其中Object[]实际上包含两个元素:AString

与上述相同,但使用自定义DTO:

class Adto {

    private final A a;
    private final String description;

    public Adto(A a, String description) {
        this.a = a;
        this.description = description;
    }

}

略微修改了查询:

SELECT new Adto(a, a.b.description)
FROM A a
WHERE a.id = :id