微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用构造函数在选择子句中为多个表的选定列编写HQL JOIN查询

我正在使用Constructor()在Select子句中为多个表的选定列编写HQL JOIN查询

我有以下实体:

实体1:NotificationObject.java

@Entity
@Table(name="notification_object")
public class NotificationObject implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue( strategy=GenerationType.IDENTITY )
    @Column( columnDeFinition="INT(10) UNSIGNED" )
    private Integer id;

    @Column( name="entity_type_id",columnDeFinition="tinyint UNSIGNED",nullable=false )
    private Short entityTypeId;

    @Column( name="entity_id",columnDeFinition="INT(10) UNSIGNED",nullable=false )
    private Integer entityId;

    @DateTimeFormat( pattern="yyyy-MM-dd" )
    @Temporal( TemporalType.TIMESTAMP )
    @CreationTimestamp
    @Column( name="created_on"/*,nullable=false*/ )
    private Date createdOn;

    @OnetoMany( mappedBy = "notificationObject" )
    private Set<Notification> notifications = new LinkedHashSet<>();

    public NotificationObject() {}
    public NotificationObject(Short entityTypeId,Integer entityId) {
        this.entityTypeId = entityTypeId;
        this.entityId = entityId;
    }

    // Getters and Setters
}

实体2:NotificationChange.java

@Entity
@Table(name="notification_change")
public class NotificationChange implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(columnDeFinition="INT(10) UNSIGNED")
    private Integer id;

    @ManyToOne( fetch=FetchType.LAZY )
    @JoinColumn(
            name="notification_object_id",nullable=false,foreignKey=@ForeignKey(name="fk_notification_change_notification_object_noti_object_id")
    )
    private NotificationObject notificationObject;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn( 
            name="actor_id",foreignKey=@ForeignKey(name="fk_notification_change_user_user_id")
    )
    private User actor;

    public NotificationChange() {}
    public NotificationChange( User actor ) {
        this.actor = actor;
    }

    // Getters and Setters
}

实体3:Notification.java

@Entity
@Table(name="notification")
public class Notification implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue( strategy=GenerationType.IDENTITY )
    @Column( columnDeFinition="INT(10) UNSIGNED" )
    private Integer id;

    @ManyToOne( fetch=FetchType.LAZY )
    @JoinColumn(
            name="notification_object_id",foreignKey=@ForeignKey(name="fk_notification_notification_object_notification_object_id")
    )
    private NotificationObject notificationObject;

    @ManyToOne( fetch=FetchType.LAZY )
    @JoinColumn(
            name="notifier_id",foreignKey=@ForeignKey(name="fk_notification_user_user_id")
    )
    private User notifier;

    @Column( name="is_seen",nullable=false )
    private boolean isSeen;

    @Column( name="is_viewed",nullable=false )
    private boolean isViewed;

    public Notification() {}
    public Notification( User notifier,boolean isSeen,boolean isViewed ) {
        this.notifier = notifier;
        this.isSeen = isSeen;
        this.isViewed = isViewed;
    }

    // Getters and Setters
}

实体4:User.java

@Entity
@Table(name="user")
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="user_id")
    private String user_id;

    // Extra fields

    @OnetoOne(cascade=CascadeType.MERGE)
    @JoinColumn(name="emp_id",columnDeFinition="INT(10) UNSIGNED")
    private Employee employee;

    @OnetoMany( mappedBy="notifier" )
    private Set<Notification> notifications = new LinkedHashSet<>();

    public User() {}
    public User(String user_id) {
        this.user_id = user_id;
    }

    // Getters and Setters
}

实体5:Employee.java

@Entity
@Table(name="employee")
public class Employee implements Serializable {

    private static final long serialVersionUID = 1L;

    public Employee() { }
    public Employee( String emp_id ) {
        this.emp_id = emp_id;
    }

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="emp_id")
    private String emp_id;

    @Column(name="first_name")
    private String first_name;

    @Column(name="last_name")
    private String last_name;

    // Extra fields

    @OnetoOne(mappedBy="employee")
    @JsonBackReference
    private User user;

    // Getters and Setters
}

DTO 1:Notify.java

public class Notify {
    private Integer notificationObjectId,notificationId,notifierId,actorId,entityId;
    private Short entityTypeId;
    private String notifierName,actorName,message,notificationLink;
    private Date createdOn;
    private boolean isSeen,isViewed;

    public Notify() {}
    public Notify ( Integer notificationObjectId,Integer notificationId,Integer notifierId,Integer actorId,Integer entityId,Short entityTypeId,String notifierName,String actorName,String message,String notificationLink,Date createdOn,boolean isViewed ) {
        // Set Values Here
    }
    public Notify (Integer notificationObjectId,boolean isViewed ) {
        // Or Here
    }

    // Getters and Setters          
}

我在JOINs很弱.
我想为实体的选定字段编写HQL JOIN查询以形成Constructor()在Notify.java DTO的Select子句中.
我试过的:

查询1

final String GET_NOTIFICATIONS_FOR_USER =
"select new support.dto.Notify ( no.id,n.id,Integer.parseInt( n.notifier.user_id ),"
+ "concat ( n.notifier.employee.first_name,' ',n.notifier.employee.last_name ),"
+ "Integer.parseInt( nc.actor.user_id ),concat( nc.actor.employee.first_name,nc.actor.employee.last_name ),"
+ "no.entityId,no.entityTypeId,no.createdOn,n.isSeen,n.isViewed ) "
+ "from Notification n,NotificationObject no,NotificationChange nc,User u,Employee e "
+ "where n.notifier.user_id = :notifierId";

查询2

final String GET_NOTIFICATIONS_FOR_USER =
"select new support.dto.Notify ( no.id,n.notifier.employee.first_name ),n.isViewed ) "
+ "from NotificationChange nc inner join nc.notificationObject no "
+ "inner join no.notifications n "
+ "where n.notifier.user_id = :notifierId";

我正在接受以下异常

java.lang.NullPointerException
at org.hibernate.internal.util.ReflectHelper.getConstructor(ReflectHelper.java:309)
at org.hibernate.hql.internal.ast.tree.ConstructorNode.resolveConstructor(ConstructorNode.java:174)
at org.hibernate.hql.internal.ast.tree.ConstructorNode.prepare(ConstructorNode.java:144)
at org.hibernate.hql.internal.ast.HqlsqlWalker.processConstructor(HqlsqlWalker.java:1091)
at org.hibernate.hql.internal.antlr.HqlsqlbaseWalker.selectExpr(HqlsqlbaseWalker.java:2328)
at org.hibernate.hql.internal.antlr.HqlsqlbaseWalker.selectExprList(HqlsqlbaseWalker.java:2194)
at org.hibernate.hql.internal.antlr.HqlsqlbaseWalker.selectClause(HqlsqlbaseWalker.java:1476)
at org.hibernate.hql.internal.antlr.HqlsqlbaseWalker.query(HqlsqlbaseWalker.java:573)
at org.hibernate.hql.internal.antlr.HqlsqlbaseWalker.selectStatement(HqlsqlbaseWalker.java:301)
at org.hibernate.hql.internal.antlr.HqlsqlbaseWalker.statement(HqlsqlbaseWalker.java:249)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:262)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:190)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:142)
at org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:115)
at org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:76)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:150)
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:298)
at org.hibernate.internal.AbstractSessionImpl.createquery(AbstractSessionImpl.java:236)
at org.hibernate.internal.SessionImpl.createquery(SessionImpl.java:1821)
at support.DAO.MasterDaoImpl.getNotifications(MasterDaoImpl.java:115)
at support.service.MasterServiceImpl.getNotifications(MasterServiceImpl.java:158)
at support.service.MasterServiceImpl$$FastClassBySpringcglib$$a355463b.invoke()
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.cglibAopProxy$cglibMethodInvocation.invokeJoinpoint(cglibAopProxy.java:717)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.cglibAopProxy$DynamicAdvisedInterceptor.intercept(cglibAopProxy.java:653)
at support.service.MasterServiceImpl$$EnhancerBySpringcglib$$8c2728e2.getNotifications()
at support.controller.WebSocketController.hello(WebSocketController.java:91)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.springframework.messaging.handler.invocation.invocableHandlerMethod.doInvoke(invocableHandlerMethod.java:185)
at org.springframework.messaging.handler.invocation.invocableHandlerMethod.invoke(invocableHandlerMethod.java:104)
at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMatch(AbstractMethodMessageHandler.java:447)
at org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler.handleMatch(SimpAnnotationMethodMessageHandler.java:443)
at org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler.handleMatch(SimpAnnotationMethodMessageHandler.java:82)
at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMessageInternal(AbstractMethodMessageHandler.java:408)
at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMessage(AbstractMethodMessageHandler.java:346)
at org.springframework.messaging.support.ExecutorSubscribableChannel$SendTask.run(ExecutorSubscribableChannel.java:135)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)

解决方法

错误告诉您Hibernate无法找到Notify构造函数.

此外,您不能在HQL查询添加Integer.parseInt.使用ResultSet中的预期类型,并从传入参数在构造函数内部执行转换.

原文地址:https://www.jb51.cc/mssql/83680.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐