为什么Hibernate尝试持久化@Transient字段会导致“无效列名”错误?

cbjzeqam  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(209)

所以我使用Hibernate,我得到了一个名为personAddress的实体,这是一个存在于数据库中的实体,因为我使用微服务,所以我使用namedQuerys来进行连接,因为有一些实体我需要加入,但我没有,这是我在hbm中的原生查询:

select address.*, cit.description cityName, sta.description stateName, ctry.description_iso_common countryName from PERSON_ADDRESS address
            inner join APP_CITIES cit on cit.id =address.city_id
            inner join APP_STATES sta on sta.id= address.state_id
            inner join APP_COUNTRY ctry on ctry.id = address.country_id
            and address.person_id = :param

问题是,cityName、stateName和countryName不在数据库对象上,因为它们来自一个关系,所以在我的实体中,我将它们作为@Transient,但在persist上,它仍然试图持久化这些列,因此它返回持久化错误(com.microsoft.sqlserver.jdbc.SQLServerException:无效的列名'cityName')如果我将类的getter设置为@Transient,它不会给予持久性错误,但查询不会打印城市。这是我的仓库中的findByPersonIs函数:

public List<PersonAddress> findByPersonIs(String iso,String personId, int offset, int limit){

        Query<PersonAddress> namedQuery = null;

        namedQuery = sessionFactory.getCurrentSession().createNamedQuery("findByPersonIs", PersonAddress.class);
        namedQuery.setParameter("param", "%".concat(personId).concat("%").toLowerCase());
        // namedQuery.setParameter("codeIso", "%".concat(iso).concat("%").toLowerCase());

        namedQuery.setParameter("param", personId);
        //namedQuery.setParameter("codeIso", iso);
        namedQuery.setMaxResults(limit).setFirstResult(offset);
        return namedQuery.getResultList();
    }

将感谢帮助解决这个问题,因为我不能把丢失的表共享(DDD),也不允许我检索到一个DTO查询(不知道为什么)
我希望实体有一个@Transient字段,这个字段不会持久化,但不知何故仍然希望检索这个值。

kt06eoxx

kt06eoxx1#

解决这个问题最有效的方法是创建一个结果集Map,在我的例子中,我想仍然使用命名查询,这样我就可以将其保留在我的xml中,但如果创建一个本地查询,也可以工作,这是我的XML捕获dto:

<query>
            <![CDATA[
             select address.id id, address.person_id personId, address.broker_id brokerId, cit.description cityName,
                     sta.description stateName, ctry.description_iso_common countryName,
                      address.street_name streetName, address.street_number streetNumber, address.post_code postCode, def.description addressType
                      from PERSON_ADDRESS address
                      inner join APP_CITIES cit on cit.id =address.city_id
                      inner join APP_COUNTRY ctry on ctry.id= address.country_id
                      inner join APP_STATES sta on sta.id = address.state_id
                      inner join DEFLIST_DATA def on def.id =address.address_type
                      inner join app_language al on al.id =def.language_id
                      where address.person_id = :param AND al.code_iso = :iso
            ]]>
        </query>
    </named-native-query>
    <sql-result-set-mapping name="PersonAddressGridGetMapping">
        <constructor-result target-class="net.amantium.odiseo.address.domain.dto.PersonAddressGridGetResponse">
            <column name ="id" />
            <column name="personId"  />
            <column name="cityName" />
            <column name="stateName"  />
            <column name="countryName"  />
            <column name="streetName" />
            <column name="streetNumber"  />
            <column name="postCode"  />
            <column name="addressType"  />
        </constructor-result>
    </sql-result-set-mapping>```

相关问题