第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

JPA:如何將本機(jī)查詢結(jié)果集轉(zhuǎn)換為POJO類集合

JPA:如何將本機(jī)查詢結(jié)果集轉(zhuǎn)換為POJO類集合

繁星coding 2019-07-26 15:02:44
JPA:如何將本機(jī)查詢結(jié)果集轉(zhuǎn)換為POJO類集合我在我的項(xiàng)目中使用JPA。我來到了一個(gè)查詢,在這個(gè)查詢中,我需要對(duì)五個(gè)表進(jìn)行聯(lián)接操作。因此,我創(chuàng)建了一個(gè)本地查詢,它返回五個(gè)字段?,F(xiàn)在,我想將結(jié)果對(duì)象轉(zhuǎn)換為javaPOJO類,該類包含相同的五個(gè)字符串。JPA中有任何方法直接將結(jié)果轉(zhuǎn)換為POJO對(duì)象列表嗎?我想出了以下解決方案。@NamedNativeQueries({       @NamedNativeQuery(           name = "nativeSQL",           query = "SELECT * FROM Actors",           resultClass = db.Actor.class),       @NamedNativeQuery(           name = "nativeSQL2",           query = "SELECT COUNT(*) FROM Actors",           resultClass = XXXXX) // <--------------- problem  })現(xiàn)在結(jié)果類中,我們是否需要提供一個(gè)類,它是實(shí)際的JPA實(shí)體?或者我們可以將其轉(zhuǎn)換為包含相同列名的任何JavaPOJO類?
查看完整描述

3 回答

?
慕田峪4524236

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超5個(gè)贊

JPA提供了一個(gè)SqlResultSetMapping,這使您可以將來自本機(jī)查詢的任何返回映射到實(shí)體中。

JPA1.0不允許映射到非實(shí)體類。僅在JPA 2.1 a中建筑成果已添加以映射java類的返回值。

另外,對(duì)于OP獲取計(jì)數(shù)的問題,應(yīng)該可以用一個(gè)單獨(dú)的結(jié)果集映射來定義結(jié)果集映射。ColumnResult


查看完整回答
反對(duì) 回復(fù) 2019-07-27
?
翻過高山走不出你

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個(gè)贊

我找到了幾個(gè)解決辦法。

使用映射實(shí)體(JPA2.0)

使用JPA2.0不可能將原生查詢映射到POJO,只能通過實(shí)體完成。

例如:

Query query = em.createNativeQuery("SELECT name,age FROM jedi_table", Jedi.class);@SuppressWarnings("unchecked")List<Jedi> items = (List<Jedi>) query.getResultList();

但在這種情況下,Jedi,必須是映射的實(shí)體類。

避免此處未檢查的警告的另一種方法是使用命名的本機(jī)查詢。因此,如果我們?cè)趯?shí)體中聲明本機(jī)查詢

@NamedNativeQuery(
 name="jedisQry", 
 query = "SELECT name,age FROM jedis_table", 
 resultClass = Jedi.class)

然后,我們可以簡單地做:

TypedQuery<Jedi> query = em.createNamedQuery("jedisQry", Jedi.class);List<Jedi> items = query.getResultList();

這是比較安全的,但我們?nèi)匀槐幌拗剖褂糜成涞膶?shí)體。

人工映射

我試驗(yàn)過的一個(gè)解決方案(在JPA2.1到來之前)是使用一點(diǎn)反射對(duì)POJO構(gòu)造函數(shù)進(jìn)行映射。

public static <T> T map(Class<T> type, Object[] tuple){
   List<Class<?>> tupleTypes = new ArrayList<>();
   for(Object field : tuple){
      tupleTypes.add(field.getClass());
   }
   try {
      Constructor<T> ctor = type.getConstructor(tupleTypes.toArray(new Class<?>[tuple.length]));
      return ctor.newInstance(tuple);
   } catch (Exception e) {
      throw new RuntimeException(e);
   }}

該方法基本上接受一個(gè)元組數(shù)組(由本機(jī)查詢返回),并通過查找具有相同數(shù)目的字段和相同類型的構(gòu)造函數(shù),將其映射到提供的POJO類。

然后我們可以使用方便的方法,例如:

public static <T> List<T> map(Class<T> type, List<Object[]> records){
   List<T> result = new LinkedList<>();
   for(Object[] record : records){
      result.add(map(type, record));
   }
   return result;}public static <T> List<T> getResultList(Query query, Class<T> type){
  @SuppressWarnings("unchecked")
  List<Object[]> records = query.getResultList();
  return map(type, records);}

我們可以簡單地使用這種技術(shù),如下所示:

Query query = em.createNativeQuery("SELECT name,age FROM jedis_table");List<Jedi> jedis = getResultList(query, Jedi.class);

帶有@SqlResultSetmap的JPA2.1

隨著JPA2.1的到來,我們可以使用@SqlResultSetmap注釋來解決這個(gè)問題。

我們需要聲明實(shí)體中某個(gè)地方的結(jié)果集映射:

@SqlResultSetMapping(name="JediResult", classes = {
    @ConstructorResult(targetClass = Jedi.class, 
    columns = {@ColumnResult(name="name"), @ColumnResult(name="age")})})

然后我們就這么做了:

Query query = em.createNativeQuery("SELECT name,age FROM jedis_table", "JediResult");@SuppressWarnings("unchecked")List<Jedi> samples = query.getResultList();

當(dāng)然,在這種情況下Jedi不需要是映射的實(shí)體。可以是普通的POJO。

使用XML映射

我是那些發(fā)現(xiàn)添加所有這些的人之一@SqlResultSetMapping在我的實(shí)體中非常具有侵入性,而且我特別不喜歡實(shí)體中命名查詢的定義,因此,我也可以在META-INF/orm.xml檔案:

<named-native-query name="GetAllJedi" result-set-mapping="JediMapping">
    <query>SELECT name,age FROM jedi_table</query></named-native-query><sql-result-set-mapping name="JediMapping">
        <constructor-result target-class="org.answer.model.Jedi">
            <column name="name" class="java.lang.String"/>
            <column name="age" class="java.lang.Integer"/>
        </constructor-result>
    </sql-result-set-mapping>

這些都是我知道的解決辦法。如果我們可以使用JPA2.1,最后兩種方法是理想的。




查看完整回答
反對(duì) 回復(fù) 2019-07-27
  • 3 回答
  • 0 關(guān)注
  • 293 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)