【发布时间】:2018-02-20 04:59:57
【问题描述】:
我是 JPA 的新手,我正在尝试将我在 JDBC 中使用的方法转换为 JPA 作为练习。 这应该计算我的数据库中所有恒星的所有质量并更新相对质量列。为了计算质量,我需要一颗恒星的温度和它在 350 微米波段的通量值。问题是我将这些数据保存在数据库的不同表中,因此我必须使用 JOIN。
JDBC 方法
public void updateAllMasses() {
String selectQuery = "SELECT s.starid, s.temperature, f.value" +
" FROM star s JOIN flux f " +
"ON s.starid = f.source " +
"WHERE f.band = 350.00 AND f.value != 0";
try {
ResultSet resultSet = databaseUtilJDBC.dbExecuteQuery(selectQuery);
while (resultSet.next()) {
String starId = resultSet.getString("starid");
Double flux350 = resultSet.getDouble("value");
Double temp = resultSet.getDouble("temperature");
if (temp != 0) {
String updateQuery = "UPDATE star " +
"SET mass = 0.053 * " + flux350 + " * (100) * (EXP(41.14 / " + temp + " ) - 1) "
+ "WHERE starid = '" + starId + "';";
databaseUtilJDBC.dbExecuteUpdate(updateQuery);
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
JPA 方法尝试
在这里,我需要在Star 对象和Flux 对象之间创建一个JOIN。
这是Star 类的草稿。
@Entity
@Table(name = "star")
public class Star implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "starid", nullable = false)
private String starId;
@Column(name = "temperature")
private BigDecimal temperature;
@Column(name = "mass")
private BigDecimal mass;
// With all constructors, getters and setters
}
这是我用于通量的实体类:
@Entity
@Table(name = "flux")
public class Flux implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId private FluxId fluxId = new FluxId();
@Column(name = "value")
private BigDecimal value;
// With constructors, getters and setters
}
使用它的 idclass:
@Embeddable
public class FluxId implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name = "source", nullable = false)
private String source;
@Column(name = "band", nullable = false)
private BigDecimal band;
// With constructors, getters and setters
}
这是我对 JPA 的尝试:
public void updateAllMasses() {
String query = "???"; // Query to get all values I need
List list = databaseUtilJPA.dbExecuteQuery(query);
for (Object aList : list) {
Star star = (Star) aList; // Here I would just get a Star object... while I would need also it's flux value at 350 band!
if (!star.getTemperature().equals(BigDecimal.valueOf(0))) {
query = "UPDATE Star star SET star.mass = 0.053 * flux.value * 100 * (EXP(41.14 / star.temperature) - 1)" +
" WHERE star.starId = '" + star.getStarId() + "'";
databaseUtilJPA.dbExecuteUpdate(query);
}
}
}
我应该写什么查询?
【问题讨论】:
-
发布您的实体的代码。并且不要使用原始类型。泛型自 Java 5 开始就存在于 Java 中,13 年前的 2004 年发布。是时候赶上来了。
-
@JBNizet 按照您的建议添加了代码 :)
-
好的。要使用连接,您需要实体之间的关联。 Flux 的源应该是 Star 类型,并使用 ManyToOne 或 OneToOne 注释(取决于基数)。您错过了 JPA 的要点,它将数据库映射为实体的互连图:员工属于公司,公司有地址,链接到城市,包含地区等。
标签: java postgresql jpa jdbc