2014-09-18 2 views
1

привет, я работаю в проекте Spring mvc с использованием данных весны jpa, у меня есть nativeQuey в интерфейсе, который простирается от JpaRepository, в этот запрос я выбрать несколько значений из Diferent таблиц и я вернутькак сделать объект [Ljava.lang.Object, возвращаемый Spring Data JPA Query

ArrayList<Object> 

я напечатал значение этого ArrayList и удовлетвориться этим:

[[Ljava.lang.Object;@1f634fe, [Ljava.lang.Object;@1361a15, [Ljava.lang.Object;@1c8c51c] 

после возвращения запроса 3 строки с 7 значений в каждой строке я подозреваю, что этот объект 3 (списки), и у каждого списка есть 7 полей, я очень уверен at - это строки и ints, у меня есть этот два импорта в моем классе, где я могу использовать значения.

import java.util.ArrayList; 
import java.lang.Object; 

Мой вопрос в том, как я могу отнести этот список, имея 3 списка внутри, чтобы получить мои значения?

это мой класс, который расширяет JpaRepository

import java.util.ArrayList; 
import java.lang.Object; 
public interface I_GL_JE_Lines extends JpaRepository<C_GL_JE_LINES, Long>{ 

@Query(value ="select value1, value2, value3, value4, value5" 
      + "from DB_Table, DB_Table2, DB_Table3" 
      + "where id_value = 1 ", 
      nativeQuery = true) 
    public ArrayList<Object> queryWithValues(); 

метод в моем классе услуги MyServiceClass.java:

import java.util.ArrayList; 
import java.lang.Object; 


public ArrayList<Object> getQueryValues() { 

      ArrayList<Object> results = null; 

      results = serviceAutoWiredVariable.queryWithValues(); 

     return results; 
    } 

и мой класс контроллера, где я пытаюсь получить мои ценности

@Autowired MyServiceClass_autoWiredServiceClassVariable; 

@RequestMapping(value = "/getVaules", method = RequestMethod.GET) 
    public String getValues(Model model) 
    { 
ArrayList<Object> objectlist = null; 

objectlist = _autoWiredServiceClassVariable.getQueryValues(); <--i call my method here and it return the lists that have 3 lists inside with 7 or more values each 

.... HERE i want an idea how to get those values or how to cast them 

//i tried this but i gives me this exception 
//java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.ArrayList 


Iterator itr = objectlist .iterator(); 
Iterator innerIterator; 
while(itr.hasNext()) 
      { 
       ArrayList<Object> obj = (ArrayList<Object>) itr.next(); 

       innerIterator= obj.iterator(); 

       while(iteradorInterno.hasNext()) 
       { 
        Object[] innerObj = (Object[]) innerIterator.next(); 

        value = String.valueOf(innerObj[0]); 
       } 

      } 

Эта строка:

ArrayList<Object> obj = (ArrayList<Object>) itr.next(); 

дает мне эту exceptio:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.ArrayList 
+0

Никогда не использовал spring-data jpa, но не должен ли он быть автоматическим, если имена столбцов совпадают с именами свойств bean? Просто сделайте этот метод возвратом 'List ' вместо 'List ' – soulcheck

+0

Я попытался вернуть это, но данные Spring jpa не работают, если вы не выбираете все атрибуты в этой таблице, а в этой таблице есть 80 атрибутов, которые мне не нужны для выбора, также у меня есть функции, такие как SUM() DECODE() в моем исходном запросе – stackUser2000

ответ

0

Что исключение говорит, вы пытаетесь преобразовать массив объектов в ArrayList. Таким образом, чтобы решить проблему, вы можете использовать эту строку кода в классе обслуживания:

Object[] results = null; 

results = serviceAutoWiredVariable.queryWithValues(); 
1

Object[] не может быть приведен к любому другому типу (кроме Object). Период.

Если вы хотите, чтобы ваши Object[] экземпляры могли быть использованы в виде списков, то вам нужно либо скопировать их на новые List объектов, или обернуть их с помощью Arrays.asList().


Другой подход (в теории!) Было бы убедить JPA отобразить строки в результирующем нечто иное, чем Object[]. Однако мои (ограниченные) исследования не показали способ сделать это .... по крайней мере, используя аннотацию Spring-data @Query.

0

Поскольку я являюсь поздним участником этой темы, я надеюсь, что кто-то другой получит выгоду. Я столкнулся с той же проблемой и потерял день, работая с пользовательским @Query.

В вашем случае Исключение произошло на итераторе. То, что вы получаете от _autoWiredServiceClassVariable.getQueryValues ​​(), является ArrayList массива объектов. И вы пытаетесь преобразовать массив объектов в ArrayList объектов, что вызывает проблему. Вы сможете получить значения результата запроса, если вы измените итерацию, как показано ниже.

Iterator itr = objectlist.iterator(); 
while(itr.hasNext()) { 
    Object[] arrObj = (Object[])itr.next(); 
    for(Object obj:arrObj) { 
     System.out.println(String.valueOf(obj)); 
    } 
} 
0

Что я явно определяющий мой тип класса в самом запросе и создал параметризированный конструктор в пользовательском объекте, который включает в себя все атрибуты, которые я хочу, чтобы загрузить из выходных данных запроса.

Так Класс хранилище будет выглядеть следующим образом:

public interface CustomObjectDAO extends CrudRepository<CustomObject, Integer> { 

     @Query("SELECT new CustomObject(obj.attribute1, obj.attribute2, 
       obj.attribute3, obj.attribute4) from CustomObject obj where 
       obj.attribute2 not in ("SELECT obj2.id FROM 
       AnotherCustomObject obj2)") 
     List<CustomObject> findByCustomObject(); 
    } 

Вот как CustomObject будет выглядеть следующим образом:

public class CustomObject{ 
    private int attribute1; 
    private String attribute2; 
    private String attribute3; 
    private String attribute4; 

    public CustomObject(){} 

    public CustomObject(int attribute1, String attribute2, String attribute3, String attribute4, String attribute5){ 
     this.attribute1 = attribute1; 
     this.attribute1 = attribute2; 
     this.attribute1 = attribute3; 
     this.attribute1 = attribute4; 
     this.attribute1 = attribute5; 
    } 

    //getters and setters 
} 

Таким образом, он будет отбрасывать список CustomObject без явного литья.

Смежные вопросы