我是JPA的新手,请原谅我,如果我的问题看起来很愚蠢。
我们在项目中使用了JPA。我看到每个实体对象都有一个与表的直接映射,表中的每一行都是该实体类型的对象。
但是,假设我只想访问一个表的一列或两列,我该怎么做呢?我问的原因是因为我手头的任务。
有两张桌子。第一个表包含使用JPA设置的所有内容,以便每行可以转换为对象类型。第一个表有一个在第二个表中引用的列,即表A
有列CLOTH_ID
,表B
有列CLOTH_ID
和CLOTH_DESCRIPTION
。表CLOTH_ID
和A
中均使用B
;但B
的{{1}}列对应CLOTH_DESCRIPTION
。
我在我的网页中显示了表格CLOTH_ID
,但我还需要在我的网页中显示:A
。是否有以JPA为导向的方法来执行此操作,或者我最好使用常规JDBC来提取CLOTH_DESCRIPTION
值?
答案 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中的列数巨大,否则更喜欢这种方法,因为它是最简单和最惯用的。
SELECT a, a.b.description
FROM A a
WHERE a.id = :id
在这种情况下,查询返回List<Object[]>
,其中Object[]
实际上包含两个元素:A
和String
。
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