Java 在Hibernate中使用@Formula中的自然连接
我在Hibernate中使用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
@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