Java 如何通过hibernate从多表查询中获取数据?
我有一个用户管理应用程序,为每个用户分配一个团队和一个或多个对不同应用程序的访问权限。现在对于报告页面,我正试图通过Hibernate从两个表(UserInfo和UserAppAccess)中获取数据,但我不能。 以下是表格: 表1(用户信息): 表2(工作队): 表3(访问): 表4(应用): 表5(UserAppAccess): 我有一个报告页面,允许管理员选择多个选项(例如:列出团队测试和应用程序APP1中的所有活动用户) 以下是我获取数据的代码,但它不起作用:Java 如何通过hibernate从多表查询中获取数据?,java,sql,hibernate,Java,Sql,Hibernate,我有一个用户管理应用程序,为每个用户分配一个团队和一个或多个对不同应用程序的访问权限。现在对于报告页面,我正试图通过Hibernate从两个表(UserInfo和UserAppAccess)中获取数据,但我不能。 以下是表格: 表1(用户信息): 表2(工作队): 表3(访问): 表4(应用): 表5(UserAppAccess): 我有一个报告页面,允许管理员选择多个选项(例如:列出团队测试和应用程序APP1中的所有活动用户) 以下是我获取数据的代码,但它不起作用: public List&l
public List<?> getReport(String teamId,String appName,UserStatus active,UserStatus inactive) {
Session session = sessionFactory.getCurrentSession();
String hql = "SELECT u.firstName,u.username,u.status,u.lastName,u.phone,u.team From UserInfo u,AppAccess a WHERE u.status =? OR u.status =? AND u.team.id = ? AND a.appName = :appName ";
Query query = session.createQuery(hql);
query.setParameter(0, active);
query.setParameter(1, inactive);
query.setParameter(2, teamId);
query.setParameter("appName", appName);
System.out.println(query.list());
return query.list();
}
通过添加
LEFT JOIN FETCH
或FETCH ALL PROPERTIES
。这将强制连接
,而不是延迟初始化
String hql = "SELECT u.firstName,u.username,u.status,u.lastName,u.phone,u.team From UserInfo u,AppAccess a FETCH ALL PROPERTIES WHERE u.status =? OR u.status =? AND u.team.id = ? AND a.appName = :appName ";
首先,可以在中找到更多信息:我希望您的每个实体类都有一个
toString()
方法(可以通过eclipse自动生成),以便您可以打印它们。打印对象引用不足以推断您是否得到了所需的内容
其次,HQL联接的语法通常如下所示:
String queryString = "select distinct f from Foo f inner join foo.bars as b" +
" where f.creationDate >= ? and f.creationDate < ? and b.bar = ?";
String queryString=“选择不同于Foo的f作为b内部连接Foo.bar”+
“其中f.creationDate>=?和f.creationDate<?和b.bar=?”;
(摘自)我建议使用本机SQL和JDBC进行报告(参见 ) 出于性能原因,最好从DAO中的结果集中创建视图模型对象。它可能看起来像是混合了抽象层次(视图层和持久层),但是当您需要获取大量数据并且不想从持久性模型到视图模型进行不必要的对象转换时,它是可以的 如果您想继续使用hibernate,您可以在视图上定义一个syntetic实体和映射,其中只包含来自多个视图的必要列:
@Entity
@Table("V_USER_REPORT")
public class UserAppData {
// columns from table "user"
@Id
@Column(name = "id", unique = true, nullable = false, length = 100)
private String id;
@Column(name = "username", unique = true, nullable = false, length = 50)
private String username;
// columns from table "user"
@Column(name = "app_name", nullable = false, length = 100)
private String appName;
// columns from table "team"
@Column(name = "team_id", unique = true, nullable = false, length = 80)
private String team_id;
@Column(name = "team_name", unique = true, nullable = false, length = 100)
private String name;
@Column(name = "team_code", unique = true, nullable = false, length = 10)
private String code;
// and so on...
}
然后,您可以像使用普通实体一样,通过参数获取此类实体。为什么选择单个字段而不是“从…”中选择用户u?您得到的是对象列表,这有什么不对?你在你的查询中加入了u和a吗?似乎您只从u中选择值,这是有意的吗?问题是有四个参数,我必须根据这四个参数生成报告。以下是参数列表:1:所有活动用户,2:所有非活动用户,3:应用程序A中的用户,4:与团队X关联的所有用户。用户可以选择一个或多个选项,并且必须根据选择生成报告。现在,如果用户只选择2:list of all inactive,那么其他三个参数将为null,或者用户可以选择team B中所有活动用户的列表,依此类推。你能给我一个SQL来处理这个场景吗
@Entity
@Table(name = "user_app_access")
@Embeddable
public class UserAppAccess implements java.io.Serializable {
private static final long serialVersionUID = 7933770163144650730L;
@Id
@Column(name = "id", unique = true, nullable = false, length = 80)
private String id;
@OneToOne
@JoinColumn(name = "user_id")
private UserInfo userInfo;
@Column(name = "app_name", nullable = false, length = 100)
private String appName;
@OneToOne
@JoinColumn(name = "access_id")
private Access access;
}
public List<?> getReport(String teamId,String appName,UserStatus active,UserStatus inactive) {
Session session = sessionFactory.getCurrentSession();
String hql = "SELECT u.firstName,u.username,u.status,u.lastName,u.phone,u.team From UserInfo u,AppAccess a WHERE u.status =? OR u.status =? AND u.team.id = ? AND a.appName = :appName ";
Query query = session.createQuery(hql);
query.setParameter(0, active);
query.setParameter(1, inactive);
query.setParameter(2, teamId);
query.setParameter("appName", appName);
System.out.println(query.list());
return query.list();
}
[[Ljava.lang.Object;@2961116f, [Ljava.lang.Object;@23bfa3a2, [Ljava.lang.Object;@7a8ff303, [Ljava.lang.Object;@9b88d2, [Ljava.lang.Object;@6333934d, [Ljava.lang.Object;@4f0bd71c, [Ljava.lang.Object;@125797cf, [Ljava.lang.Object;@34afa071, [Ljava.lang.Object;@764e75bc, [Ljava.lang.Object;@1913c652, [Ljava.lang.Object;@61413e5a, [Ljava.lang.Object;@264b898, [Ljava.lang.Object;@22930462, [Ljava.lang.Object;@6204cfa9, [Ljava.lang.Object;@29dd9285, [Ljava.lang.Object;@11be6f3c, [Ljava.lang.Object;@6d78d53d, [Ljava.lang.Object;@17f7cff1, [Ljava.lang.Object;@e74e382, [Ljava.lang.Object;@1c047338, [Ljava.lang.Object;@68286fe6, [Ljava.lang.Object;@36ca9a76, [Ljava.lang.Object;@2f62d514, [Ljava.lang.Object;@1932c5a, [Ljava.lang.Object;@6544c984, [Ljava.lang.Object;@70a2d0d, [Ljava.lang.Object;@2d13b417, [Ljava.lang.Object;@6894691f, [Ljava.lang.Object;@6781a7dc, [Ljava.lang.Object;@7133919a]
String hql = "SELECT u.firstName,u.username,u.status,u.lastName,u.phone,u.team From UserInfo u,AppAccess a FETCH ALL PROPERTIES WHERE u.status =? OR u.status =? AND u.team.id = ? AND a.appName = :appName ";
String queryString = "select distinct f from Foo f inner join foo.bars as b" +
" where f.creationDate >= ? and f.creationDate < ? and b.bar = ?";
@Entity
@Table("V_USER_REPORT")
public class UserAppData {
// columns from table "user"
@Id
@Column(name = "id", unique = true, nullable = false, length = 100)
private String id;
@Column(name = "username", unique = true, nullable = false, length = 50)
private String username;
// columns from table "user"
@Column(name = "app_name", nullable = false, length = 100)
private String appName;
// columns from table "team"
@Column(name = "team_id", unique = true, nullable = false, length = 80)
private String team_id;
@Column(name = "team_name", unique = true, nullable = false, length = 100)
private String name;
@Column(name = "team_code", unique = true, nullable = false, length = 10)
private String code;
// and so on...
}