【问题标题】:Problems in JOIN using Hibernate使用 Hibernate 的 JOIN 问题
【发布时间】:2014-03-21 12:00:09
【问题描述】:

我是 JAVA Hibernate 的初学者,不知道如何解决这个问题

我有两个表:Usuario 和 Certificado,我想创建一个关系和他们的关系。

班级证书:

@Entity
@Table(name = "Certificado",
       uniqueConstraints = { @UniqueConstraint( columnNames = { "identifierUnique", "handleUser" } ) } )
public class Certificado {
    @Id
    @GenericGenerator(name="generator", strategy="increment")
    @GeneratedValue(generator="generator")
    private int handle;
    @Column(length = 255)
    @Column
    private int handleUser;

    @ManyToOne
    @JoinColumn(name="handle_user", referencedColumnName="handle")
    private Usuario usuario;
}

类Usuario:

@Entity
@Table(name = "Usuario")
public class Usuario {
    @Id
    @GenericGenerator(name="generator", strategy="increment")
    @GeneratedValue(generator="generator")
    private int handle;
    @Column(length = 255, unique = true)
    private String email;   
    @Column(length = 20)
    private String password;    
    @OneToMany(mappedBy="usuario", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Set<Certificado> certificados;

        ...
}

当我执行一个 SQL 函数时:

public static List<Object[]> loadCertificado30DaysBeforeExperation() throws Exception{      
        Session.begin();
        try {
            try {
                String select = "SELECT c FROM Certificado c "
                    + "LEFT JOIN c.handleUser AS user";
                return Session.list(select);
            } catch (Exception e) {
                throw e;
            }
        } finally {
            Session.commit();
        }
    }

错误:

   java.lang.NullPointerException

堆栈跟踪:

java.lang.NullPointerException
    at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromJoinElement(HqlSqlWalker.java:393)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.joinElement(HqlSqlBaseWalker.java:3645)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3431)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3309)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:706)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:562)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:299)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:247)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:249)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:184)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:137)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:105)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:168)
    at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:221)
    at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:199)
    at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1778)
    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:606)
    at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:352)
    at com.sun.proxy.$Proxy15.createQuery(Unknown Source)
    at br.com.persistence.Session.list(Session.java:96)
    at br.com.utils.ServletUtils.loadCertificado30DaysBeforeExperation(ServletUtils.java:134)
    at br.com.monitoramento.MonitorThread.run(MonitorThread.java:25)

【问题讨论】:

    标签: java hibernate postgresql join


    【解决方案1】:

    Hibernate 的 HQL 不支持区间 (and generally has extremely poor date maths support)。

    您需要使用本机 SQL,或者通过在 Java 端进行本地日期计算来表达不带 interval 的查询。

    或者您可以注册一个用户定义的 SQL 函数并创建一个 PostgreSQL 函数来执行您想要的日期数学运算。

    见:

    还有更多。

    【讨论】:

    • 我更改了 sql 并出现另一个错误:NullPointerException。
    【解决方案2】:

    您是否尝试过从 '30' 中删除 '' -> 间隔 30 天。 或者转义 '30' -> \'30\'。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-20
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多