質問
ここで、(二重の変数)を持つオブジェクトを読みたい場合は、
私は問題を抱えています これは私のコードです:
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 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
これが私のクエリマネージャーです。
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エンティティをロードする地理的座標のですが、私は、クエリを設定するとします それはヌルretunいます。
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
が、それは(私は私のテーブルにLAT = 0と長= 0でbranchbuilding Insertsome)
、正しい結果を返します下に私は、クエリを使用する場合return queryManager.executeQuery("from BranchBuildingEntity b where b.buildingAdr.blongitude = 0.0 AND b.buildingAdr.blatitude = 0.0");
私の問題である。ここで、すべてのボディは知っていますか?
解決
デビッド・Mが言うように、
、ダブルスの直接比較を行いません。どちらかの異なった表現を使用するか、または間接的な比較を行います。
abs(b.buildingAdr.blongitude - 51.6371154785156) < threshold
閾値は、二つの経度が同じであると見なされるべき(数値)でなければならどれだけ近いかを指示します。だから、あなたはあなたのための最高の作品しきい値の値(例えば0.000000001)を選んでます。
他のヒント
ほぼ確実に簡単にダブルダウンの精度に関連する休止状態ではありません。そここのトピックについてすでに上のSO数多くの質問がありますが、基本的に、あなたは、たとえば、51.6371154785156と比較しようとしているが、この値の内部ストレージがこれに正確に等しいではないかもしれません。あなたが一定の精度にこれらの座標を格納する場合、また、あなたの選択の問題を修正するこの機能を提供しています小数点データ・タイプを検討します。
所属していません StackOverflow