Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle Hibernate@JoinColumnOrFormula比较空值_Oracle_Hibernate - Fatal编程技术网

Oracle Hibernate@JoinColumnOrFormula比较空值

Oracle Hibernate@JoinColumnOrFormula比较空值,oracle,hibernate,Oracle,Hibernate,我在Hibernate中使用@JoinColumnOrFormula检索嵌入记录时遇到问题 可嵌入: @Embeddable public class Location implements Serializable { @Id @Column(name = "loc_id") private String id; @Column(name = "loc_city") private String

我在Hibernate中使用@JoinColumnOrFormula检索嵌入记录时遇到问题

可嵌入:

    @Embeddable
    public class Location implements Serializable {

        @Id
        @Column(name = "loc_id")
        private String id;

        @Column(name = "loc_city")
        private String city;

        @Column(name = "loc_building")
        private String building;

        @Column(name = "loc_floor")
        private String floor;

        @Column(name = "loc_room")
        private String room;
    }
正在由以下人员使用:

    @Entity
    @Table(name = "Persons")
    public class Person implements Serializable {

    ...
      @ManyToOne
      @JoinColumnsOrFormulas({
              @JoinColumnOrFormula(formula = @JoinFormula(value = "prs_loc_city", referencedColumnName = "loc_city")),
              @JoinColumnOrFormula(formula = @JoinFormula(value = "prs_loc_building", referencedColumnName = "loc_building")),
              @JoinColumnOrFormula(formula = @JoinFormula(value = "prs_loc_floor", referencedColumnName = "loc_floor")),
              @JoinColumnOrFormula(formula = @JoinFormula(value = "prs_loc_room", referencedColumnName = "loc_room"))})
      private Location location = new Location();

    ...
    }
这将生成用于检索此人位置的正确Oracle SQL:

    SELECT
    ...
           FROM PERSONS this_
           LEFT OUTER JOIN LOCATIONS location_
              ON this_.prs_loc_city = location_.loc_city
                 AND this_.prs_loc_building = location_.loc_building
                 AND this_.prs_loc_floor = location_.loc_floor
                 AND this_.prs_loc_room = location_.loc_room
但是,这适用于提供所有四列的所有情况。 列prs_loc_room empty(null)的人员将不会从位置表中检索相应的记录,尽管它存在(loc_room为null)

要使其正常工作,正确的SQL应该是:

    SELECT
    ...
           FROM PERSONS this_
           LEFT OUTER JOIN LOCATIONS location_
              ON NVL(this_.prs_loc_city, 'null') = NVL(location_.loc_city, 'null')
                 AND NVL(this_.prs_loc_building, 'null') = NVL(location_.loc_building, 'null')
                 AND NVL(this_.prs_loc_floor, 'null') = NVL(location_.loc_floor, 'null')
                 AND NVL(this_.prs_loc_room, 'null') = NVL(location_.loc_room, 'null')
但是如何使用Hibernate实现这一点呢?

你能试试这个@Formula(“COALESCE(field1,field2)”参考:你能试试这个@Formula(“COALESCE(field1,field2)”参考: