mysql - 根据 SQL 和 hibernate 映射中另一个表中引用行到我的表的 count() 设置列的值

标签 mysql sql hibernate hibernate-mapping

我的数据库中有以下表格。我希望 testuser 表中的 booked_items 列包含与 testbooking 表中用户关联的行数。这当然可以在程序内部完成,但如果可以在 hibernate 映射和表 DDL 中完成,那就很脏了。

CREATE TABLE `testuser` (
  `id` bigint(20) NOT NULL,
  `username` varchar(30) DEFAULT NULL,
  `password` varchar(128) DEFAULT NULL,
  `booked_items` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `testbooking` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) NOT NULL,
  `item_id` bigint(20) NOT NULL,
  `start_date` date DEFAULT NULL,
  `end_date` date DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `FKEC747367A12BE486` (`item_id`),
  KEY `FKEC7473671463A66C` (`user_id`),
  CONSTRAINT `FKEC7473671463A66C` FOREIGN KEY (`user_id`) REFERENCES `testuser`
(`id`),
  CONSTRAINT `FKEC747367A12BE486` FOREIGN KEY (`item_id`) REFERENCES `testitem`
(`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;

CREATE TABLE `testitem` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `title` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=latin1;

testuser 表的 hibernate 映射是:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="my.hibernate.actors.User" discriminator-value="user"
        table="testuser" catalog="efeu">
        <id name="id" type="java.lang.Long">
            <column name="id" />
            <generator class="increment" />
        </id>
        <discriminator column="user_type" type="string" length="8" />
        <property name="username" type="java.lang.String" not-null="true"
            unique="true" unique-key="true">
            <column name="username" length="30" />
        </property>
        <property name="password" type="java.lang.String" not-null="true">
            <column name="password" length="128" />
        <subclass name="my.hibernate.actors.Subscriber"
            discriminator-value="subsc">
            <property name="bookedItems" type="java.lang.Integer" column="booked_items" />
            <set name="bookings" inverse="true" cascade="all-delete-orphan">
                <key column="user_id" />
                <one-to-many class="my.hibernate.operations.Booking" />
            </set>
        </subclass>
        <subclass name="my.hibernate.actors.Clerk"
            discriminator-value="clerk" />
    </class>
</hibernate-mapping>

testbooking 表的 hibernate 映射是:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="my.hibernate.operations.Booking" table="testBooking" catalog="efeu">
        <id name="id" type="java.lang.Long">
            <column name="id" />
            <generator class="native" />
        </id>

        <many-to-one name="userID" column="user_id" cascade="persist"
            not-null="true" class="my.hibernate.actors.Subscriber" />
        <many-to-one name="itemID" column="item_id"  cascade="persist"
            not-null="true" class="my.hibernate.items.Item" />

        <property name="startDate" type="java.sql.Date" not-null="true">
            <column name="start_date" length="10" />
        </property>

        <property name="endDate" type="java.sql.Date">
            <column name="end_date" length="10" />
        </property>
    </class>
</hibernate-mapping>
PS。我想针对这个问题问两个单独的问题。一次用于 Hibernate,一次用于 SQL,但我担心它会被视为重复。对于 Hibernate 需要了解 SQL 我很想知道。它是否取决于 SQL 的方言?我目前正在询问 mysql 方言。

最佳答案

您可以使用用户类的属性以及与其关联的 SQL 公式。

<property name="booked_items" type="long" formula="(SELECT COUNT(tb.id) FROM testbooking AS tb WHERE tb.user_id = id)"/>

看看这个答案:似乎重复

Calculated property with JPA / Hibernate

关于mysql - 根据 SQL 和 hibernate 映射中另一个表中引用行到我的表的 count() 设置列的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14317294/

相关文章:

hibernate ,如何按条件计数

mysql - Power BI 未连接到 AWS MySQL 实例

php - 如何使用 PHP/MySQL 建立主题标签之间的关系?

sql - 如何删除从 SQL 查询获取的以下数据中的交换列?

php - 通过外列更新 MySQL 查询

java - 自动将日期存储到数据库中

java - Hibernate 4 中的 SessionFactory.openSession(Connection)

MySQL 在运行使用临时的查询时不会建立连接

php - 分配表 INSERT INTO 防止重复

php - CodeIgniter 正在复制 SQL 查询