مشكلة مع اختيار مزدوج في السبات
سؤال
لدي مشكلة عند رغبة كائن القراءة مع المكان (متغير مزدوج) هذا هو الرمز الخاص بي:
الجدول BranchBuilding:
@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 AMBBEBTable:
@Embeddable
public class Address implements Serializable {
String bstate;
String bcity;
String bmainStreet;
String bremainAdr;
double blongitude;
double blatitude;
int bcentralBuilding;
//Some getter and Setter
هذا هو مدير الاستعلام الخاص بي:
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;
}
هذا صانع الفصل:
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;
}
أريد تحميل كيان BuildingBranch من خلال تنسيق الجغرافي ولكن عندما أقوم بتعيين الاستعلام، فهو يعيق NULL.
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
ولكن عندما أستخدم الاستعلام أدناه، فهو إرجاع النتيجة الصحيحة (I InsertSomeBuilding Bruchbuilding بواسطة Lat = 0 و Long = 0 في طاولتي)
return queryManager.executeQuery("from BranchBuildingEntity b where b.buildingAdr.blongitude = 0.0 AND b.buildingAdr.blatitude = 0.0");
أي جسم يعرف أين هي مشكلتي؟
المحلول
كما يقول ديفيد م، لا تفعل مقارنة مباشرة من الزوجي. إما استخدام تمثيل مختلف أو القيام بمقارنة غير مباشرة:
abs(b.buildingAdr.blongitude - 51.6371154785156) < threshold
تملي قيمة العتبة مدى إغلاق اثنين من الطولان (عدديا) أن تكون هي نفسها. لذلك يمكنك اختيار قيمة للعتبة التي تعمل بشكل أفضل بالنسبة لك (على سبيل المثال 0.000000001).
نصائح أخرى
بالتأكيد لا يرتبط السباتات ولكن ببساطة إلى دقة مزدوجة. هناك العديد من الأسئلة بالفعل حول هذا الموضوع، ولكن في الأساس تحاول مقارنة 51.6371154785156، على سبيل المثال، قد لا يكون التخزين الداخلي لهذه القيمة مساويا تماما لهذا. إذا كنت ترغب في تخزين هذه الإحداثيات بدقة ثابتة، ففكر في نوع بيانات عشري يوفر هذه الإمكانية، والتي ستؤدي أيضا إلى إصلاح مشكلاتك المحددة.