如何创建此实体命名查询

Posted

技术标签:

【中文标题】如何创建此实体命名查询【英文标题】:How to create this entity named query 【发布时间】:2017-11-14 09:36:25 【问题描述】:

我有一个通知服务。向用户显示的通知取决于他们的权限。通知是通过三个表实现的,它们是通知、通知类型(其定义通知类型及其定义用户权限的日志),以及权限表(id,权限名) 下面添加了通知和通知类型表。

通知

public class Notifications  

@Id 
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String title;
private String deatils;
private String link;
@OneToOne(fetch=FetchType.EAGER)
@PrimaryKeyJoinColumn(name="NotificationTypeId",referencedColumnName="Id")
private NotificationTypes notificationTypes;
private Boolean tenantSpecific;
private Boolean userSpecific;
private Long recieverUserId;
private Boolean activeFlag;
private Long tenantId;
@Temporal(TemporalType.TIMESTAMP)
private Date insertedDttm;
private Long insertedBy;
@Temporal(TemporalType.TIMESTAMP)
private Date updatedDttm;
private Long updatedBy;

NotifiactionType 实体

public class NotificationTypes implements Serializable 
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;

private String typeName;
@Temporal(TemporalType.TIMESTAMP)
private Date insertedDttm;
private Long insertedBy;
@Temporal(TemporalType.TIMESTAMP)
private Date updatedDttm;
private Long updatedBy;

@OneToMany(fetch = FetchType.EAGER)
private List<RLPermissions> permissions;


在以上两个实体中,我想按特定权限查找通知列表 这样 Select nt from notification nt where nt.notificationType.permission in(permissionList) 如何在命名查询中解决这个问题。

【问题讨论】:

【参考方案1】:

尝试使用joins获取Permission的id,然后传入id列表:

Select nt 
from notification n 
   inner join n.notificationType nt
   inner join nt.permissions p 
where p.id in :permissionIds

在事务方法中:

session.createNamedQuery("query", Notifications.class)
            .setParameterList("permissionIds", permissionIds)
            .list();

【讨论】:

@marciej 没有该查询的 ON 条件?

以上是关于如何创建此实体命名查询的主要内容,如果未能解决你的问题,请参考以下文章

我可以在不创建实体类的情况下对大型 sql 使用休眠命名查询吗?

NHibernate 命名查询,每个子类都有表

JPQL:多重连接。如何做我的命名查询?

使用对象属性的 JPA 命名查询

如何声明命名查询超越 Hibernate 实体类?

如何将命名查询转换为 sql 查询?