如何在休眠运行时获取 table 传递 table 名称和列名称的记录?
How can I get table records passing table name and column names at runtime in hibernate?
要求是从数据库中获取记录,其中在 运行 时间选择了特定列和 table 名称。
我正在使用 Java、Hibernate 和 Mysql。可以使用 JDBC。但我想用休眠来做。
Post 提示,如果有人知道的话
提前致谢
Hibernate
比 JDBC
有更多的特征。最好的功能是 Hibernate
支持 Object Oriented Principles
。您可以为实体使用 Polymorphism
、Inheritance
、Encapsulation
。
您必须有一个 BaseEntity
class 并且所有其他 class 必须从这个 class.
扩展
public class BaseEntity {
}
然后所有其他 classes 扩展这个 class。假设您还有另外两个 classes 或实体。
User.class
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Table(name = "USERS")
@Entity
public class User extends BaseEntity implements Serializable {
@Id
@Column(name = "ID")
private int id;
@Column(name = "NAME")
private String name;
@Column(name = "SURNAME")
private String surname;
public User() {
}
public User(int id, String name, String surname) {
this.id = id;
this.name = name;
this.surname = surname;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
}
Info.class
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Table(name = "INFO")
@Entity
public class Info extends BaseEntity implements Serializable {
@Column(name = "TEXT")
private String text;
@Id
@Column(name = "ID")
private int id;
public Info() {
}
public Info(String text, int id) {
this.text = text;
this.id = id;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
您还必须为每个 class 添加 mapping
标签到 configuration.hbm.xml
您的 DAO
如下所示。
public List getList(BaseEntity baseEntity, String[] columnNames) {
Criteria criteria = session.createCriteria(baseEntity.getClass(), "be");
ProjectionList projectionList = Projections.projectionList();
for (String columnName : columnNames) {
projectionList.add(Projections.property("be." + columnName), columnName); // adding column for selection
}
criteria.setProjection(projectionList);
criteria.setResultTransformer(new AliasToBeanResultTransformer(baseEntity.getClass())); // for mapping result to entity
return criteria.list();
}
public static void main(String[] args) {
String[] columnNames = {"name", "surname"}; // columnNames which you want to select
List<Info> users = new GeneralDAO().getList(new User(), columnNames); // you can pass any class User, Info or etc.
}
嗯,Hibernate 可以做的远不止 JDBC,你要找的东西可以用 Hibernate 写成这样:
Query query = session.createSQLQuery(
"select s.stock_code from stock s where s.stock_code = :stockCode")
.setParameter("stockCode", "7277");
List result = query.list();
如您所见,table 名称和列可以动态定义,这至少与 JDBC 相当,甚至可能更简单。您不必使用参数,显然,您可以在代码中模块化构建查询。
更多详细信息参考
https://www.mkyong.com/hibernate/hibernate-native-sql-queries-examples/
要求是从数据库中获取记录,其中在 运行 时间选择了特定列和 table 名称。
我正在使用 Java、Hibernate 和 Mysql。可以使用 JDBC。但我想用休眠来做。
Post 提示,如果有人知道的话
提前致谢
Hibernate
比 JDBC
有更多的特征。最好的功能是 Hibernate
支持 Object Oriented Principles
。您可以为实体使用 Polymorphism
、Inheritance
、Encapsulation
。
您必须有一个 BaseEntity
class 并且所有其他 class 必须从这个 class.
public class BaseEntity {
}
然后所有其他 classes 扩展这个 class。假设您还有另外两个 classes 或实体。
User.class
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Table(name = "USERS")
@Entity
public class User extends BaseEntity implements Serializable {
@Id
@Column(name = "ID")
private int id;
@Column(name = "NAME")
private String name;
@Column(name = "SURNAME")
private String surname;
public User() {
}
public User(int id, String name, String surname) {
this.id = id;
this.name = name;
this.surname = surname;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
}
Info.class
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Table(name = "INFO")
@Entity
public class Info extends BaseEntity implements Serializable {
@Column(name = "TEXT")
private String text;
@Id
@Column(name = "ID")
private int id;
public Info() {
}
public Info(String text, int id) {
this.text = text;
this.id = id;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
您还必须为每个 class 添加 mapping
标签到 configuration.hbm.xml
您的 DAO
如下所示。
public List getList(BaseEntity baseEntity, String[] columnNames) {
Criteria criteria = session.createCriteria(baseEntity.getClass(), "be");
ProjectionList projectionList = Projections.projectionList();
for (String columnName : columnNames) {
projectionList.add(Projections.property("be." + columnName), columnName); // adding column for selection
}
criteria.setProjection(projectionList);
criteria.setResultTransformer(new AliasToBeanResultTransformer(baseEntity.getClass())); // for mapping result to entity
return criteria.list();
}
public static void main(String[] args) {
String[] columnNames = {"name", "surname"}; // columnNames which you want to select
List<Info> users = new GeneralDAO().getList(new User(), columnNames); // you can pass any class User, Info or etc.
}
嗯,Hibernate 可以做的远不止 JDBC,你要找的东西可以用 Hibernate 写成这样:
Query query = session.createSQLQuery(
"select s.stock_code from stock s where s.stock_code = :stockCode")
.setParameter("stockCode", "7277");
List result = query.list();
如您所见,table 名称和列可以动态定义,这至少与 JDBC 相当,甚至可能更简单。您不必使用参数,显然,您可以在代码中模块化构建查询。
更多详细信息参考 https://www.mkyong.com/hibernate/hibernate-native-sql-queries-examples/