将 SQL 翻译成 Hibernate HQL
Translate SQL into Hibernate HQL
我正在使用 Spring 启动和 Hibernate。我最近才开始使用 Java,所以我不太擅长。
我有一个 OneToMany 单向关系与连接 table。
RssUrl Table
CREATE TABLE `rss_url` (
`id` BIGINT(19) NOT NULL,
`created_at` DATETIME(6) NOT NULL,
`updated_at` DATETIME(6) NULL DEFAULT NULL,
`url` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci',
PRIMARY KEY (`id`) USING BTREE
)
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB
;
用户Table
CREATE TABLE `user` (
`id` BIGINT(19) NOT NULL,
`created_at` DATETIME(6) NOT NULL,
`updated_at` DATETIME(6) NULL DEFAULT NULL,
`email` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci',
`is_active` BIT(1) NULL DEFAULT NULL,
`password` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `email_unique_constraint_1873213` (`email`) USING BTREE
)
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB
;
加入table
CREATE TABLE `user_rssurl` (
`user_id` BIGINT(19) NOT NULL,
`rss_url_id` BIGINT(19) NOT NULL,
UNIQUE INDEX `UK_paw8syp4ru29oqh7430u2c7vl` (`rss_url_id`) USING BTREE,
INDEX `FK7gp98smro2y75g1026ut00jsf` (`user_id`) USING BTREE,
CONSTRAINT `FK7gp98smro2y75g1026ut00jsf` FOREIGN KEY (`user_id`) REFERENCES `javadb`.`user` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT `FKpxci6mn3aayjdpkdigcpekrsy` FOREIGN KEY (`rss_url_id`) REFERENCES `javadb`.`rss_url` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION
)
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB
;
我正在尝试将此 SQL 翻译成 HQL
SELECT COUNT(u.id)
FROM `user` u
LEFT JOIN user_rssurl urs ON urs.user_id = u.id
LEFT JOIN rss_url ru ON urs.rss_url_id = ru.id
WHERE u.id = ?
AND urs.rss_url_id = ?
它基本上是检查 url 是否已经与用户相关联。我敢肯定它不是最高效的 sql 但它完成了工作(我很高兴听到我可以如何改进它,但这不是重点)。
到目前为止,我得到了这个,这真的不是很多。
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT COUNT(u.id) FROM User u LEFT JOIN user_rssurl urs on urs.user_id = u.id LEFT JOIN RssUrl ru on urs.rss_url_id = ru.id WHERE u.id = ?1 AND urs.rss_url_id = ?2")
Integer findInRelation(Long uid, Long rssUrlId);
}
我也考虑过替代方法,例如让数据库出错并捕获异常,但这似乎是错误的。
这个问题有两个部分:
上述查询的正确 HQL 是什么?
有更简单的方法吗?我来自 PHP 背景。使用像 Doctrine 这样的 ORM 让事情变得容易多了。事实上,我们可以更轻松地获取相关实体。我很难相信 Hibernate 没有更好的方法来做到这一点。
我很想 google 自己做,但坦率地说,我不知道 google 到底要做什么。
实际上,javajpa对jointable查询不友好;在那里,我可以给你两个方法,仅供参考:
- 您可以将此查询拆分为三个基本查询来完成您的问题,我知道这种方法不好;
- 您可以将实体定义为连接实体,然后使用
@OneToOne
或@ManyToOne
anaotations来反映关系;
- 我还有3个建议,不用jpa,用mybatis,在mybatis中,你可以直接用你的sql查询很多table;
我正在使用 Spring 启动和 Hibernate。我最近才开始使用 Java,所以我不太擅长。
我有一个 OneToMany 单向关系与连接 table。
RssUrl Table
CREATE TABLE `rss_url` (
`id` BIGINT(19) NOT NULL,
`created_at` DATETIME(6) NOT NULL,
`updated_at` DATETIME(6) NULL DEFAULT NULL,
`url` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci',
PRIMARY KEY (`id`) USING BTREE
)
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB
;
用户Table
CREATE TABLE `user` (
`id` BIGINT(19) NOT NULL,
`created_at` DATETIME(6) NOT NULL,
`updated_at` DATETIME(6) NULL DEFAULT NULL,
`email` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci',
`is_active` BIT(1) NULL DEFAULT NULL,
`password` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `email_unique_constraint_1873213` (`email`) USING BTREE
)
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB
;
加入table
CREATE TABLE `user_rssurl` (
`user_id` BIGINT(19) NOT NULL,
`rss_url_id` BIGINT(19) NOT NULL,
UNIQUE INDEX `UK_paw8syp4ru29oqh7430u2c7vl` (`rss_url_id`) USING BTREE,
INDEX `FK7gp98smro2y75g1026ut00jsf` (`user_id`) USING BTREE,
CONSTRAINT `FK7gp98smro2y75g1026ut00jsf` FOREIGN KEY (`user_id`) REFERENCES `javadb`.`user` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT `FKpxci6mn3aayjdpkdigcpekrsy` FOREIGN KEY (`rss_url_id`) REFERENCES `javadb`.`rss_url` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION
)
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB
;
我正在尝试将此 SQL 翻译成 HQL
SELECT COUNT(u.id)
FROM `user` u
LEFT JOIN user_rssurl urs ON urs.user_id = u.id
LEFT JOIN rss_url ru ON urs.rss_url_id = ru.id
WHERE u.id = ?
AND urs.rss_url_id = ?
它基本上是检查 url 是否已经与用户相关联。我敢肯定它不是最高效的 sql 但它完成了工作(我很高兴听到我可以如何改进它,但这不是重点)。
到目前为止,我得到了这个,这真的不是很多。
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT COUNT(u.id) FROM User u LEFT JOIN user_rssurl urs on urs.user_id = u.id LEFT JOIN RssUrl ru on urs.rss_url_id = ru.id WHERE u.id = ?1 AND urs.rss_url_id = ?2")
Integer findInRelation(Long uid, Long rssUrlId);
}
我也考虑过替代方法,例如让数据库出错并捕获异常,但这似乎是错误的。
这个问题有两个部分:
上述查询的正确 HQL 是什么?
有更简单的方法吗?我来自 PHP 背景。使用像 Doctrine 这样的 ORM 让事情变得容易多了。事实上,我们可以更轻松地获取相关实体。我很难相信 Hibernate 没有更好的方法来做到这一点。
我很想 google 自己做,但坦率地说,我不知道 google 到底要做什么。
实际上,javajpa对jointable查询不友好;在那里,我可以给你两个方法,仅供参考:
- 您可以将此查询拆分为三个基本查询来完成您的问题,我知道这种方法不好;
- 您可以将实体定义为连接实体,然后使用
@OneToOne
或@ManyToOne
anaotations来反映关系; - 我还有3个建议,不用jpa,用mybatis,在mybatis中,你可以直接用你的sql查询很多table;