Hibernate Criterios de retorno de registros donde la columna es distinto

Ejemplo de tabla de base de datos:

  1. ID = 1, msgFrom = ‘Hola’, foobar = ‘meh’
  2. ID = 2, msgFrom = ‘Adiós’, foobar = ‘comentarios’
  3. ID = 3, msgFrom = ‘Hola’, foobar = ‘respuesta’

De la muestra de salida deseado (generada por la consulta de hibernate):

  1. ID = 1, msgFrom = ‘Hola’, foobar = ‘meh’
  2. ID = 2, msgFrom = ‘Adiós’, foobar = ‘comentarios’

En el ejemplo anterior, el tercer registro de excluir de los resultados desde el msgFrom columna es el mismo. Digamos que el Java/Hibernate clase se llama Mensaje. Me gustaría que los resultados se devuelven como una lista de objetos de los Mensajes (o los Objetos que pueden ser lanzados para el Mensaje, de todos modos). Quiero usar la API de Criterios, si es posible. Vi este ejemplo y parece similar, pero no puedo aplicar correctamente todavía.

 select e from Message e 
    where e.msgFrom IN (select distinct m.msgFrom 
                          from Message m
                          WHERE m.msgTo = ? 
                          AND m.msgCheck = 0");

La razón por la que estoy haciendo esto es para tener el filtrado de los distintos registros de hecho en la base de datos, así que no estoy interesado en las respuestas donde tengo que filtrar nada en el servidor de aplicaciones.

edit: Artículo mostrando básicamente lo que quiero hacer. http://oscarvalles.wordpress.com/2008/01/28/sql-distinct-on-one-column-only/

cualquier actualización sobre esto?
puede ser stackoverflow.com/questions/5196243/… va a ayudar ?
Yo ya lo vimos. Que post es la combinación de dos columnas y la hacen diferente. No es lo que estoy tratando de hacer.
seguro, quiero decir que han intentado establecer la proyección Projections.distinct(Projections.property("id.msgFrom")) ?
donde se identificador declarado? Cómo sobre esto… si usted sabe lo que quiere de mí para intentar, publicar una respuesta y voy a probar la sintaxis exacta que usted me da.

OriginalEl autor KyleM | 2012-08-13

3 Kommentare

  1. 6

    Por favor, intente esto y quiero saber

    DetachedCriteria msgFromCriteria = DetachedCriteria.forClass(Message.class);
    ProjectionList properties = Projections.projectionList();
    properties.add(Projections.groupProperty("messageFrom"));
    properties.add(Projections.min("id"),"id");
    msgFromCriteria.setProjection(properties);
    
    Criteria criteria = s.createCriteria(Message.class);
    criteria.add(Subqueries.propertiesIn(new String[]{"messageFrom","id"}, 
        msgFromCriteria));
    List<Message> list = criteria.list();
    
    for(Message message:list){
        System.out.println(message.getId()
            +"-------"
            +message.getMessageFrom()
            +"-----"
            +message.getFoobar());
    }
    Gracias. Voy a probar esto antes de que el final del día y le permiten saber si funciona. Agradezco la respuesta.
    Hizo u comprobarlo?
    Lo siento, no lo hice. Salí temprano del trabajo debido a los problemas de coche, pero definitivamente voy a comprobar que tan pronto como pueda y otorgar cualquiera de los puntos (recompensa y/o upvotes). Gracias.
    yo uso el código de arriba pero quiero volver a las distintas mensaje de chat donde userid = someValue y devolver sólo las distintas y por último .. ¿puede usted decirme cómo puedo hacer eso ?

    OriginalEl autor Java P

  2. 2

    La dificultad con esta consulta no es tanto con Hibernate, de por sí, pero con el modelo relacional en general. En el ejemplo, es decir que esperan que las filas 1 y 2, pero ¿por qué no acaba tan fácilmente esperar las filas 2 y 3? Sería una decisión arbitraria si se devuelve la fila 1 fila o 3, ya que ambos tienen el mismo valor en el msgFrom campo. Las bases de datos no toman decisiones arbitrarias como este. Es por eso que distinct debe ser aplicado a toda la lista de selección de columnas, no un subconjunto. No son específicas de base de datos maneras de agarrar la primera filas coincidentes. Por ejemplo, eche un vistazo a

    SELECT DISTINCT en una columna

    A veces habrá una columna de fecha que se pueden utilizar para decidir cual de las filas coincidentes para volver, pero de nuevo las consultas se hacen algo complejo:

    ¿Cómo puedo SELECCIONAR filas con MAX(valor de la Columna), DISTINTAS por medio de otra columna en SQL?

    Capturar la fila que tiene el valor máximo de una columna

    Si usted no se preocupan por cualquiera de las otras columnas, sólo se puede utilizar un simple distinct, combinado con Hibernate constructor de la sintaxis (no probado):

    select new Message(msgFrom) from (select distinct msgFrom from Message)

    pero tienes que aceptar a tirar todas las demás columnas.

    Al final, a menudo terminan sólo haciendo esto en el código como un post-filtro de consulta. Otra opción es crear una a otra mesa, y decir CurrentMessage, que incluye msgFrom como parte de la clave. Habrá más trabajo en el mantenimiento de esta tabla hasta la fecha (que usted necesita para actualizar una fila cada vez que se agrega una fila a la tabla de Mensajes), pero la consulta será mucho más fácil.

    Haciendo como un «post filtro de consulta» es lo que no quiero hacer ya que yo tendría que hacer que en el servidor de la aplicación. Véase mi edición..
    ¿Tienes alguna criterios adicionales en su consulta? Como dijo James, volviendo registro de 1 vs 3 es totalmente arbitraria la medida de la base de datos de referencia, que es por lo que se recomienda hacerlo de la aplicación del lado.
    Entiendo que es arbitrario, pero no importa para mi caso de uso. 🙁

    OriginalEl autor James Scriven

  3. 0
    DetachedCriteria msgFromCriteria = DetachedCriteria.forClass(Message.class);
    msgFromCriteria.setProjection(Projections.distinct(Projections.property("msgFrom")));
    ....
    Criteria criteria = getSession().createCriteria(Message.class);
    criteria.add(Subqueries.propertyIn("msgFrom", msgFromCriteria));
    criteria.list();
    Gracias, James, no lo he probado todavía porque estoy en otro lugar hoy en día. Voy a dejar que usted sabe que tarde o mañana por la mañana si tengo algún problema.
    James, lamentablemente esto no funciona para mí. Recuperan más de 10.000 registros, incluso aunque sólo hay 10 distintas «msgFrom» valores». Tiene esta trabajado para usted en el pasado?
    Pensé que este ejemplo de trabajo debo admitir. Yo por lo tanto a la conclusión de que usted tendrá que resolver esta usando recta HQL y evitar el uso de la API de Criterios. Parece que mucha gente tiene toparon con problemas de uso de Criterios distintos y juntos.

    OriginalEl autor JamesB

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea