将 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);
}

我也考虑过替代方法,例如让数据库出错并捕获异常,但这似乎是错误的。

这个问题有两个部分:

我很想 google 自己做,但坦率地说,我不知道 google 到底要做什么。

实际上,javajpa对jointable查询不友好;在那里,我可以给你两个方法,仅供参考:

  1. 您可以将此查询拆分为三个基本查询来完成您的问题,我知道这种方法不好;
  2. 您可以将实体定义为连接实体,然后使用@OneToOne@ManyToOne anaotations来反映关系;
  3. 我还有3个建议,不用jpa,用mybatis,在mybatis中,你可以直接用你的sql查询很多table;