Query en Java

CrIpI

Hola,

Alguien me puede echar una mano sobre como hacer una query sobre una lista de objetos en java??

Por ejemplo tengo una lista de articulos con sus atributos y quiero realizar un filtro por varios atributos.

Las listas estan en arraylist pero puedo cambiar la opcion si no me quedara otra.

Gracias.

E

Seguro que alguno de por aquí te puede ayudar, yo acabo de empezar con java pero me he molestado en buscar y he encontrado esto http://quaere.codehaus.org/ (http://stackoverflow.com/questions/2848508/can-i-query-a-list-java ) a ver si te sirve. Siempre puede venir uno que sepa más del tema para aclarar tus dudas directamente.

Un saludo.

1 respuesta
CrIpI

#2 No voy a ser borde pero crees que no me he molestado en buscar? Acaso crees que quiero suspender o algo? XD

Gracias de todas formas.

Solo que he encontrado un monton de tipos de hacer la query y no me convence ninguno. A poder ser sin librerias.

1 respuesta
E

#3 Pues mucho animo y espera una respuesta. Espero que no te suspendan.

(Así te bumpeo el hilo)

B

Hombre, si no quieres usar librerías lo primero que se me ocurre es que te montes un método que recoja los parametros de búsqueda y recorrerte la lista buscando coincidencias con los parametros para ir escupiendo los válidos a otra lista y retornarla como resultados de la búsqueda

1 respuesta
CrIpI

#5 Si es lo que creo que voy a hacer. Pero creo que con la clase query puedes hacer busquedas con algo parecido a sql.

El problema es la busqueda por nombre que tengo que aplicar un filtro con "contiene".

Gracias tio.

2 respuestas
B

#6 uhm pero si el attr :nombre es de la clase String de java seguro que de alguna manera puedes tirar alguna función de coincidencia con el parametro de búsqueda. Sobre la clase Query no se que decirte porque yo en Java desde que dejé de estudiar ando mas pez que la leche.

edit:

justo he encontrado algo al buscar

String word = "cat";
String text = "The cat is on the table";
Boolean found;

found = text.contains(word);

Sacado fresquito de stackoverflow ;)

1 respuesta
CrIpI

#7 Tirare de .equals y ale.

Oh el contains me puede valer XD no lo conocia.

JuAn4k4

Que mierda de IDE usais que no os salen los métodos de la clase al poner el punto ?

String text = "";
text.

wait for it ...

String text = "";
text.[toString()                    String]
       [contains(String str)     boolean]
       [startsWith(String str)  boolean]
       [...]

http://docs.oracle.com/javase/6/docs/api/java/lang/String.html

1 respuesta
CrIpI

#9 Lo siento no se me habia ocurrido. La verdad es que buscaba algo mas orientado a base de datos para cuando tuviera que hacer la BBDD en sql server. He usado mucho java pero contains y startsWith nunca :S

Ya lo tengo terminado si tengo que realizar alguna modificacion empezare por ahi.

2 respuestas
JuAn4k4

No entiendo muy bien lo que quieres decir con "orientado a bbdd", pero:

.contains("...") ==== LIKE '%...%'
.startsWith("...") === LIKE '...%'
1 respuesta
Spacelord

#10 No tiene nada que ver una cosa con la otra. Una cosa es buscar una concurrencia en un array de strings, por ejemplo, y otra muy distinta es hacer un select en una BBDD a través de JDBC con SQL integrado en el código Java. No son el mismo concepto, ni se hacen igual.

1 respuesta
elkaoD

#11 #12 lo llevo pensando varios días. ¿No será que en #6 se refiere a LINQ? "Pero creo que con la clase query puedes hacer busquedas con algo parecido a sql."

Y es fácil confundir Java con C#.

2 respuestas
Spacelord

#13 Yo es que pensaba que se refería a la clase Query, que sí existe en Java. Pero en mi vida la he usado y no sé ni como se construye, porque siempre he tirado de JDBC para BBDD o de recorrer arrays, comparar strings, etc., para objetos dentro del propio código, así que no le he dicho nada por eso. Pero cuando ha dicho que busca algo parecido a conectividad con BBDD he visto la API y la clase Query no se parece en nada a una query SQL con JDBC.

Y no creo que esté confundiendo C# con Java, sería muy fuerte no saber en qué lenguaje estás codificando. XDD

CrIpI

#13 SI me referia algo a linq he trabajado bastante en .NET y ahora con java ando algo perdido. Luego nos dejaran utilizar Bases de datos y si tengo todos las funciones en formato sql ya hechas pues tardo la mitad.

Muchas gracias a todo el mundo por la ayuda.

SikorZ

#10 Contains no es mas que un for sobre la lista haciendo equals en cada uno de los elementos de la lista, no es nada milagroso XD.

Y no se si te he entendido bien, dices de cargar listas y demas haciendo una query con objetos? en plan HQL?

Select D from Distritos as D
JOIN FETCH D.listaCasasEnDistrito AS LCED

Algo de este estilo te refieres? de la entidad distrito fetcheas la lista de casas que pertenecen a dicho distrito?

EDIT: No he comprendido bien lo que quieres decir yo creo, pero si me haces comprenderlo seguro que puedo ayudarte =/

1 respuesta
CrIpI

#16 Algo asi:

SELECT *
FROM Articulos
WHERE precio > $25

En java tengo una lista asi:

list <Articulo> list_Articulos = new ArrayList();

4 respuestas
elkaoD

#17 eso no se puede hacer en Java.

La clase Query que se ha mencionado funciona con Java Persistence, que no tiene nada que ver con SQL (y mejor que huyas).

En resumen: lo más que puedes hacer es abstraer una fachada que te vaya sobre colecciones o SQL independentemente. O mejor, trabaja con SQL directo si puedes.

1 respuesta
CrIpI

#18 Solo preguntaba si se podia hacer con la clase Query o alguna libreria pero al final lo he hecho todo por codigo.

1 respuesta
Fastestwat

#17 Haces una iteracion con .getPrecio y lo vas guardando en otra lista.

Básicamente lo de #22

elkaoD

#19 sí, y yo solo respondo a tu pregunta xD

Básicamente, o tiras por JDBC que, que yo sepa, no tiene un driver para colecciones... o no puedes hacer SQL.

Query es "parecido" a SQL pero pertenece a la persistencia de Java que es una mierda.

Spacelord

#17 No, no se puede.

Si tienes un ArrayList de objetos lo que tienes que hacer es recorrerlo con un iterador y hacer un equal a cada elemento para ver si coincide con el criterio de búsqueda. ¿Qué es lo que hay dentro del ArrayList? Porque lo de "artículos con sus atributos" no lo acabo de pillar. ¿Te refieres a que tienes varias instancias de una clase Artículo metidas ahí dentro?

Si es eso, una lista de objetos Artículo, la cosa sería algo como:

int precio = 25;
list <Articulo> list_Articulos = new ArrayList();
Iterator<Object> it = arrayList.iterator();
while(it.hasNext())
{

   //Comparas el valor que devuelve artículo.getPrecio() con el valor de la variable precio. Si coincide, haces lo que sea con ello. Si no, se itera el bucle.

}
1 respuesta
SikorZ

Porque decis que lo de #17 no se puede hacer? no lo comprendo, lo veo bastante simple, cargar los articulos de la lista donde el precio sea X en un array, no veo el problema con HQL/JPA =S.

Seria un simple:

List listaArticulos = new ArrayList()<Articulo>;
listaArticulos = articulosSrv.getListaArticulosPrecioMenorX();

y palante teniendo un servicio que tire de un genericDao mismo que cargue la lista de resultados en la entity Articulo, es bastante sencillo =S (si he entendido bien lo que el dice)

1 respuesta
elkaoD

#23 él quiere usar SQL directamente sobre las colecciones, para que luego cuando use BD el cambio sea directo.

Es decir, el quiere literalmente poner:

SELECT *
FROM Articulos
WHERE precio > 25

Nada de llamadas a Java.

Esto se puede con C# y LINQ, pero no en Java.

1 2 respuestas
SikorZ

#24 Que tiene una coleccion ya completa y quiere sacar de ahi los que cumplen esa condicion con SQL? A eso te refieres?

1 1 respuesta
CrIpI

#25 Sip.

JuAn4k4

#24 No lo hecho de menos ni nada linq... anda que no facilitaba la vida..

1 respuesta
elkaoD

#27 pásate a la prog. funcional y olvidarás su existencia :P

1 respuesta
Spacelord

#28 Precisamente estoy ahora liado con un curso de Coursera y, aparte de sufrir como un bellaco, estoy usando SML. De momento me está gustando. Me cuesta cambiar la forma de pensar, pero cuando lo que imaginas por defecto como un bucle encaja en la forma de una función ves que es mucho mejor así.

1

Usuarios habituales