当前位置: 首页 > 知识库问答 >
问题:

Hibernate生成不正确的查询

毋宪
2023-03-14

我有一个复合密钥的实体。订阅和源具有多对多的关系。

    @Entity
    @Table(name = "SUBSCRIPTION_SOURCES")
    data class SubscriptionSource (

       @ManyToOne(fetch = FetchType.LAZY)
       @MapsId("subs_id")
       val subscription: Subscription,

       @ManyToOne(fetch = FetchType.LAZY)
       @MapsId("source_id")
       val source: Source,

       @EmbeddedId
       val subscriptionSourceId: SubscriptionSourceId = SubscriptionSourceId(subscription.id, source.id),

       @Column(name = "value")
       val value : Long
   )

Table "SUBSCRIPTION_SOURCES" has only three columns: subs_id, source_id, value.

我正在使用Spring数据存储库来处理它。

当我尝试使用方法saveAll时,它会抛出

“com.mysql.jdbc.exceptions.jdbc4.mysqlsyntaxerrorexception:未知列'subscripti0_.subscription_id'”

同时尝试在保存后返回值。

Hibernate生成以下查询:

   select
        subscripti0_.source_id as source_i1_6_0_,
        subscripti0_.subs_id as subs_id2_6_0_,
        subscripti0_.subscription_id as subscrip4_6_0_, // error happens here
        subscripti0_.value as value3_6_0_ 
    from
        SUBSCRIPTION_SOURCES subscripti0_ 
    where
        subscripti0_.source_id=? 
        and subscripti0_.subs_id=?

所以,现在我很困惑,如果我的实体中甚至没有这个字段,为什么Hibernate要将一个带有subscription_id的字符串放入查询中呢?

@Embeddable
data class SubscriptionSourceId (

    @Column(name = "subs_id")
    val subsId : Long?,

    @Column(name = "source_id")
    val sourceId : Long?

) : Serializable

类订阅:

@Entity
@Table(name = "SUBSCRIPTIONS")
data class Subscription(
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        var id: Long? = null,

        @Column(name = "subscription_id")
        var subscriptionId: String?,

        @Column(name = "submitted_on")
        var submittedOn: LocalDateTime?,

        @Column(name = "status_MPP")
        var statusMpp: String?,

        @Column(name = "requested_by_user")
        var requestedByUser: String?,

        @Column(name = "requested_by_user_email")
        var requestedByUserEmail: String?,

        @Column(name = "organization_name")
        var organizationName: String?,

        @Column(name = "vm")
        var virtualMachine: String?,

        @Column(name = "node")
        var node: String?,

        @Column(name = "period")
        var period: String?,

        @Column(name = "ad_criterion")
        var adCriterion: String?,

        @Column(name = "name")
        var name: String?,

        @Column(name = "description")
        var description: String?,

        @Column(name = "s_number")
        var sNumber: String?,

        @Column(name = "p_number")
        var pNumber: String?,

        @Column(name = "reason")
        var reason: String?,

        @Column(name = "months")
        var months: String?,

        @Column(name = "start_date")
        var startDate: String?,

        @Column(name = "x_start_date")
        var actualStartDay: String? = startDate,

        @Column(name = "end_date")
        var endDate: String?,

        @Column(name = "x_end_date")
        var actualEndDate: String? = endDate,

        @Column(name = "channel")
        var channel: String?,

        @Column(name = "connection")
        var connection: String?,

        @Column(name = "connection_data")
        var connectionData: String?,

        @Column(name = "action")
        var action: String?,

        @Column(name = "department")
        var department: String?,

        @Column(name = "login")
        var login: String?,

        @Column(name = "customer_name")
        var customerName: String?,

        @Column(name = "customer_postaddress")
        var customerPostAddress: String?,

        @Column(name = "phone")
        var phone: String?,

        @Column(name = "customer_chief")
        var customerChief: String?,

        @Column(name = "user_name")
        var userName: String?,

        @Column(name = "position")
        var position: String?,

        @Column(name = "user_postaddress")
        var userPostAddress: String?,

        @Column(name = "user_phone")
        var userPhone: String?,

        @Column(name = "user_chief")
        var userChief: String?,

        @Column(name = "location")
        var location: String?,

        @Enumerated(EnumType.STRING)
        @Column(name = "status")
        var status: SubscriptionStatus? = SubscriptionStatus.REQUEST,

        @Column(name = "comment")
        var comment: String? = "",

        @ManyToMany(fetch = FetchType.EAGER)
        @JoinTable(
                name = "MTM_NODES2SUBSCRIPTIONS",
                joinColumns = [JoinColumn(name = "subs_id")],
                inverseJoinColumns = [JoinColumn(name = "node_id")]
        )
        var nodes : Set<Node> = emptySet(),

        @ManyToMany(fetch = FetchType.EAGER)
        @JoinTable(name = "SUBSCRIPTION_SOURCES",
                joinColumns = [JoinColumn(name = "subs_id", referencedColumnName = "id")],
                inverseJoinColumns = [JoinColumn(name = "source_id", referencedColumnName = "id")])
        val sources : Set<Source?> = emptySet(),

        @Column(name = "db_status")
        val dbStatus: SubscriptionDbStatus?

)

共有1个答案

艾正浩
2023-03-14

我终于解决了我的问题。我已经向SubscriptionSource类中的字段添加了@JoinColumn注释,并按照JB Nizet的建议更改了@Mapsid注释中的值。现在看起来是这样。

@Entity
@Table(name = "SUBSCRIPTION_SOURCES")
data class SubscriptionSource (

    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("subsId")
    @JoinColumn(name = "subs_id")
    val subscription: Subscription,

    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("sourceId")
    @JoinColumn(name = "source_id")
    val source: Source,

    @EmbeddedId
    val subscriptionSourceId: SubscriptionSourceId = SubscriptionSourceId(subscription.id, source.id),

    @Column(name = "value")
    val value : Long
)

感谢所有人。

 类似资料:
  • 我正在从多个表/POJO中检索数据。我想要JSON格式的数据。在Pojo类中,我使用@JsonProperty。但我仍然没有得到所需格式的结果Json。我的结果是: 我想要格式

  • Springfox昂首阔步的用户界面有错误的基本网址。我不清楚19080端口从哪里来,因为没有服务监听该端口。我需要做什么设置才能让springfox生成正确的基本网址? Swagger UI http://dev.example.com/newapi/swagger-ui.html 错误的基本URL 基本URL:dev.example。com:19080/newapi 正确的基本URL 基本UR

  • 我想用预处理器实现虚拟视图。一个简单的例子: HQL之前: 有效HQL后: 本质上,我需要一种在执行查询之前处理查询的方法(而不是在运行中创建视图,这会产生很高的成本)。

  • 我有这样的疑问: 请注意,但不知为什么结果是... 我错过了什么?

  • 问题内容: 我在Go中编写了一个简短的程序,可以通过stdin提供的密码生成bcrypt密码哈希。下面的最小示例: 在另一个程序(Go Web服务器)中,我接受来自HTTP 请求的用户密码,并针对由以上代码生成的哈希进行测试,并将其保存到启动时加载的配置文件中,如下所示: 但是,当我知道正确时,这将报告失败。经过一番调查后,我发现当我使用此网站测试我的值时,上面的内容最初生成了错误的输出:http

  • 我的项目使用Hibernate版本4.0.1.Final和JPA2.0。我需要更改一个hql-add顺序,看起来很简单,只是它现在以SQL sytax错误结尾。 我定义了这个HQL命名查询: 从实体%s中选择%s,其中s.status=:状态顺序按%s优先级,s.startdate ->粗体是我要补充的部分。 现在,由于这个命名查询是用lock-lockmodetype.pessimistic_w