JPA2 (Hibernate), как запросить 2 таблицы (объединены), но нужны только определенные свойства из 2-й таблицы - PullRequest
1 голос
/ 01 декабря 2011

Я использую JPA2 с hibernate в качестве провайдера в среде java ee6.

У меня есть отношение один ко многим, и когда я получаю все строки для одной стороны для отображения на странице JSF, я хочу отобразить некоторые свойства многих сторон, ** но не все **, и даже избегать их загрузки. свойства их при заполнении многих сторонних объектов и я не уверен, как это сделать.

вот фрагмент

Я хочу получить все строки для таблицы A и отобразить их в таблице jsf, при отображении строк для таблицы A я также хочу отобразить некоторые свойства из таблицы B в той же таблице JSF, и в идеале даже не извлекать / хранить неиспользованные свойства из таблицы B

TBL_A
________________
int     ID
varchar FIRSTNAME
varchar LASTNAME

а второй

TBL_B
___________
int      ID
varchar  VERSION  // display on jsf page
varchar  XML_DATA //large, don't want to load when getting results for A/B join
int      A_ID     

и мой связанный с JPA2 класс похож на

@Entity
@Table(name = "TBL_A")
@NamedQueries // not sure what sql to create to accomplish this?
({ @NamedQuery(name = "A_and_B.findAll", query = "SELECT a FROM EntityA a") })

public class EntityA implements Serializable 
{    
   @Id
   @GeneratedValue(strategy=GenerationType.IDENTITY)
   @NotNull
   @Column(name = "ID", nullable = false)
   private Integer id;
.

@Column(name = "FIRSTNAME")
private String firstname;
.
@Column(name = "LASTNAME")
private String lastname;
.
@OneToMany(mappedBy = "entityA", fetch = FetchType.EAGER)
private List<EntityB> entityBList;

и мой связанный с TBL_B объект -

@Entity
@Table(name = "TBL_B")  
public class EntityB implements Serializable 
{ 
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@NotNull
@Column(name = "ID", nullable = false)
private Integer id;
.        
@Column(name = "VERSION")
private String version;
.
@Column(name = "XML_DATA")
private String xmlData;
.
@JoinColumn(name = "A_ID", referencedColumnName = "ID")
@ManyToOne
private EntityA entityA;    

У меня есть страница JSF, на которой отображается таблица данных / список записей TBL_A, а также столбец VERSION из TBL_B, при получении всех строк для TBL_A.

Мне пришлось использовать тип извлечения EAGER, чтобы избежать ошибки отложенной медленной инициации сделать это. надеюсь, что это правильный путь.

при загрузке всех сущностей TBL_B, я полагаю, я не против загружать все строки TBL_B в entityBList, но я не хочу, чтобы список бинов EntityB имел загруженное свойство xmlData, потому что оно значительно велико.

Может кто-нибудь объяснить, как я могу это сделать?

как я могу сделать это с помощью моего именованного запроса

public List<EntityA> findAll_A_Entities() 
{
   return em.createNamedQuery("A_and_B.findAll", EntityA.class).getResultList();
}

1 Ответ

0 голосов
/ 01 декабря 2011

Одно из решений - сделать свойство ленивым, но для этого требуется дополнительная конфигурация сборки - см. doc .

Другой вариант - переместить поле xmlData в производный класс и использовать поддержку наследования hibernate.

Если вы запрашивали EntityB напрямую, вы можете использовать проекционный запрос для выбора только обязательных полей. Когда это в ассоциации коллекции, это невозможно.

...