Java 在Hibernate中使用@Formula中的自然连接

Java 在Hibernate中使用@Formula中的自然连接,java,mysql,hibernate,join,formula,Java,Mysql,Hibernate,Join,Formula,我在Hibernate中使用@Formula时遇到问题 我有三张桌子: CREATE TABLE IF NOT EXISTS `tz_points_logs` ( `points_log_id` bigint(20) NOT NULL, `points_to_uid` bigint(20) NOT NULL, `points_get_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `points_rule_id` int(4

我在Hibernate中使用
@Formula
时遇到问题

我有三张桌子:

CREATE TABLE IF NOT EXISTS `tz_points_logs` (
  `points_log_id` bigint(20) NOT NULL,
  `points_to_uid` bigint(20) NOT NULL,
  `points_get_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `points_rule_id` int(4) NOT NULL,
  `points_meta` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `tz_points_rules` (
  `points_rule_id` int(4) NOT NULL,
  `points_rule_credits` int(4) NOT NULL,
  `points_rule_title` varchar(32) NOT NULL,
  `points_rule_description` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `tz_users` (
  `uid` bigint(20) NOT NULL,
  `username` varchar(16) NOT NULL,
  `password` varchar(32) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
在Hibernate中,有三种映射模型:
User
PointsLog
PointsRule

现在,在
User
模型中有一个
@Formal
字段:

@Entity
@Table(name = "tz_users")
public class User implements Serializable {
    // Getters and Setters

    @Id
    @GeneratedValue
    @Column(name = "uid")
    private long uid;

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

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

    @OneToMany(targetEntity = PointsLog.class, 
                fetch = FetchType.LAZY, mappedBy = "user")
    private List<PointsLog> pointsLogs = new ArrayList<PointsLog>();

    @Formula(value = "(SELECT COUNT(*) FROM tz_points_logs pl NATURAL JOIN tz_points_rules WHERE pl.points_to_uid=uid)")
    private long credit;
}
似乎Hibernate无法识别
@Formula
中的
自然连接。
是否有其他方法来实现此功能

顺便说一句,下面的陈述很好

@Formula(value = "(SELECT COUNT(*) FROM tz_points_logs pl WHERE pl.points_to_uid=uid)")

非常感谢。

中讨论了类似的问题。这里的要点是-Hibernate将
NATURAL
关键字视为属性/列名。解决方法应该是将自然注册为方言中的
关键字

例如:

// extend the correct dialect ... in this case MySql
// but simply extend the currently used dialect
public class CustomMySQLDialect extends MySQL5InnoDBDialect
{
    public CustomMySQLDialect()
    {
        super();
        registerKeyword("NATURAL");
    }
}
接下来,将Hibernate配置为使用此
custommysqldial
,并应生成公式:

// instead of this
// user0_.NATURAL JOIN

// we should get this
NATURAL JOIN

仍然不工作
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解在“user0.NATURAL JOIN tz_points_rules pr WHERE pl.points_to_uid=user0_uid=user0.uid”附近使用的正确语法,以及“在第1行
我添加了
extendedMysqldial
类并编辑了Spring配置:In”
org.springframework.orm.hibernate4.LocalSessionFactoryBean
hibernate.dialent=com.company.package.database.extendedmysqldialent
您展示的是一个证据,证明自定义方言不存在。一旦您拥有了自定义方言,就可以在Hibernate配置中对其进行配置。。和注册自然关键字,Hibernate将不会使用它来注入“用户”。我进行了测试,它对我有效,因为我想说的是:Hibernate就是这样工作的。否则,它将试图逃避公式中的每个单词。但事实并非如此。Hibernate知道什么是关键字,应该跳过这些关键字。。。
// instead of this
// user0_.NATURAL JOIN

// we should get this
NATURAL JOIN