Pregunta

Tengo un problema cuando se quiere leer con objeto donde (doble variable) este es mi código:

BranchBuilding Tabla:

@Entity
@Table(name = "branchbuilding", uniqueConstraints={@UniqueConstraint(columnNames={"buildingname","branch_fk"})})//uniqueConstraints={@UniqueConstraint(columnNames={"username","buildingname"})}
public class BranchBuildingEntity implements Serializable {

    @Id
    @GeneratedValue
    private int id;
    @Column(name = "buildingname", length = 64)
    private String buildingName;
    @Column(name = "description", columnDefinition = "mediumtext", length = 16777215)
    private String description;
    @Embedded
    @AttributeOverrides({
        @AttributeOverride(name = "bremainAdr", column = @Column(name = "bremainadr", columnDefinition = "mediumtext", length = 16777215, nullable=true)),
        @AttributeOverride(name = "bmainStreet", column = @Column(name = "bmainstreet", length = 64, nullable=true)),
        @AttributeOverride(name = "bstate", column = @Column(length = 64, nullable=true)),
        @AttributeOverride(name = "bcity", column = @Column(length = 64, nullable=true)),
        @AttributeOverride(name = "bcentralBuilding", column = @Column(name = "bcentralbuilding", columnDefinition = "tinyint", nullable=true)),
        @AttributeOverride(name = "blongitude", column = @Column(nullable=true)),
        @AttributeOverride(name = "blatitude", column = @Column(nullable=true))
    })
    Address buildingAdr;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "branch_fk", referencedColumnName = "id", nullable = false)
    private BranchEntity branch;

    @OneToMany(mappedBy = "branchbuilding", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @OnDelete(action=OnDeleteAction.CASCADE)
    @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
    private Set<BuildingTelEntity> buildingtel = new HashSet<BuildingTelEntity>();
//some setter and getter

Adrresse Embbedable:

@Embeddable
public class Address implements Serializable {

    String bstate;
    String bcity;
    String bmainStreet;   
    String bremainAdr;
    double blongitude;
    double blatitude;
    int bcentralBuilding;
//Some getter and Setter

Este es mi Query Manager:

public List<T> executeQuery(String query, Object... values) throws DatabaseException {
        logger.info("it's at the first of executeQuery(String query, Object... values)");
        List<Object> ret;
        Session sess = null;
        boolean freed = false;
        List<T> result;
        try {
            sess = HibernateUtil.getSession();
            Transaction tx = sess.beginTransaction();
            Query q = sess.createQuery(query);
            for (int i = 0; i < values.length; i++) {
                if (values[i].getClass().getSimpleName().equals("Long")) {
                    q.setLong(i, (Long) values[i]);
                } else if (values[i].getClass().getSimpleName().equals("String")) {
                    q.setString(i, (String) values[i]);
                } else if (values[i].getClass().getSimpleName().equals("Integer")) {
                    q.setInteger(i, (Integer) values[i]);
                } else if (values[i].getClass().getSimpleName().equals("Double")) {
                    q.setDouble(i, (Double) values[i]);
                } else if (values[i].getClass().getSimpleName().equals("Boolean")) {
                    q.setBoolean(i, (Boolean) values[i]);
                } else {
                    q.setEntity(i, values[i]);
                }
            }
            ret = q.list();
            tx.commit();
            result = makeClass(ret);
            HibernateUtil.freeSession(sess);
            freed = true;
        } catch (HibernateException e) {
            logger.error("Hibernate Exception occurred in executeQuery() Method", e);
            e.printStackTrace();
            if (!freed && sess != null) {
                HibernateUtil.freeSession(sess);
            }
            throw new DatabaseException("Can not execute query.");
        } catch (Exception e) {
            logger.fatal("Exception occurred in executeQuery() Method", e);
            System.out.println(e.getMessage());
            throw new DatabaseException("Can not execute query.");
        }

        return result;
    }

Este es un fabricante de clase:

 private List<T> makeClass(List<Object> input) {
        List<T> ret = new ArrayList<T>();
        int size = input.size();
        for (int i = 0; i < size; i++) {
            T curr = (T) input.get(i);
            ret.add(curr);
        }
        return ret;
    }

quiero cargar una entidad buildingBranch por su coordenada geográfica, pero cuando me puse de consultas se retun nula.

 return queryManager.executeQuery("from BranchBuildingEntity b where b.buildingAdr.blongitude = 51.6371154785156 AND b.buildingAdr.blatitude = 35.658412064282"); 

or

 return queryManager.executeQuery("from BranchBuildingEntity b where b.buildingAdr.blongitude = ? AND b.buildingAdr.blatitude = ?", longit, latid);//longit and latid both are double 

pero cuando se utiliza consulta siguiente es devolver un resultado correcto (I Insertsome branchbuilding por lat = 0 y largo = 0 en mi mesa)

return queryManager.executeQuery("from BranchBuildingEntity b where b.buildingAdr.blongitude = 0.0 AND b.buildingAdr.blatitude = 0.0"); 

cualquier cuerpo sabe dónde está mi problema?

¿Fue útil?

Solución

Como dice David M, no hago la comparación directa de dobles. O bien utilizar una representación diferente o hacer una comparación indirecta:

abs(b.buildingAdr.blongitude - 51.6371154785156) < threshold

El valor umbral dicta lo cerca dos longitudes tienen que ser (numéricamente) para ser considerado para ser el mismo. Así que elija un valor umbral para que funcione mejor para usted (por ejemplo 0.000000001).

Otros consejos

Es casi seguro que no Hibernate relacionada sino simplemente a la precisión de un doble. Hay numerosas cuestiones que ya están en SO acerca de este tema, pero en esencia lo que están tratando de comparar a 51,6371154785156, por ejemplo, y el almacenamiento interno de este valor puede no ser exactamente igual a este. Si desea almacenar estas coordenadas con una precisión fija, tenga en cuenta un tipo de datos decimal que ofrece esta capacidad, que también será a continuación, fijar sus selectos problemas.

Ejemplo:? Cuando debo usar doble en vez de decimal

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top