Hibernate Left Outer Присоединиться - PullRequest
7 голосов
/ 02 августа 2011

У меня есть способ обслуживания Hibernate как таковой: "SELECT sc FROM SecurityContact sc WHERE sc.securityId=:securityId2". securityId2 передается пользователем. Каждый SecurityContact имеет отношение «один к одному» с контактом, поэтому Hibernate автоматически вызывает соединение при выполнении этого запроса. Однако соединение, которое всегда выполняет Hibernate, является внутренним объединением, которое не будет работать должным образом для моих целей. Есть ли способ заставить Hibernate внутренне генерировать левое внешнее соединение вместо этого? Вот код для класса SecurityContact:

/**
 * The persistent class for the SecurityContact database table.
 * 
 */
@Entity
@FXClass(kind=FXClassKind.REMOTE)
public class SecurityContact implements Serializable {
    private static final long serialVersionUID = 1L;
    @Transient private String uid;
    @FXIgnore
    public String getUid() {
        if (uid == null) {
            uid = "" + securityContactId;
        }
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="securityContact_id")
    private Long securityContactId;

    @Column(name="security_id")
    private String securityId;

    @Column(name="create_date")
    private String createDate;

    @Column(name="create_user")
    private String createUser;

    @Column(name="modify_date")
    private String modifyDate;

    @Column(name="modify_user")
    private String modifyUser;

    //bi-directional many-to-one association to AgentContact

    @ManyToOne
    @JoinColumn(name="agent_id", referencedColumnName="contact_id")
    private AgentContact agentContact;

    //bi-directional many-to-one association to AuditContact
    @ManyToOne
    @JoinColumn(name="audit_id", referencedColumnName="contact_id")
    private AgentContact auditContact;

    public SecurityContact() {
    }
    @FXKeyColumn
    public Long getSecurityContactId() {
        return this.securityContactId;
    }

    public void setSecurityContactId(Long securityContactId) {
        this.securityContactId = securityContactId;
    }

    public String getSecurityId() {
        return this.securityId;
    }

    public void setSecurityId(String securityId) {
        this.securityId = securityId;
    }

    public String getCreateDate() {
        return this.createDate;
    }

    public void setCreateDate(String createDate) {
        this.createDate = createDate;
    }

    public String getCreateUser() {
        return this.createUser;
    }

    public void setCreateUser(String createUser) {
        this.createUser = createUser;
    }

    public String getModifyDate() {
        return this.modifyDate;
    }

    public void setModifyDate(String modifyDate) {
        this.modifyDate = modifyDate;
    }

    public String getModifyUser() {
        return this.modifyUser;
    }

    public void setModifyUser(String modifyUser) {
        this.modifyUser = modifyUser;
    }
    @FXManyToOne(parent="parent", property="contactId")
    public AgentContact getAgentContact() {
        return this.agentContact;
    }

    public void setAgentContact(AgentContact agentContact) {
        this.agentContact = agentContact;
    }
    @FXManyToOne(parent="parent", property="contactId")
    public AgentContact getAuditContact() {
        return this.auditContact;
    }

    public void setAuditContact(AgentContact auditContact) {
        this.auditContact = auditContact;
    }

} 

Ответы [ 6 ]

2 голосов
/ 02 августа 2011

Попробуйте fetch=select на сопоставлении "многие к одному"

Также см. http://community.jboss.org/wiki/AShortPrimerOnFetchingStrategies и http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html

1 голос
/ 10 апреля 2012

Отношения: Счёт много - Сотрудник один

конфигурация в xml:

        <many-to-one name="employee" class="active.security.domain.Employee" lazy="false">
        <column name="EmpId"  />
    </many-to-one>

Java-код:

        Session session = HibernateUtil.getCurrentSession();

    Criteria criteria = session.createCriteria(Account.class);
    criteria.add(Restrictions.eq("application.id", applicationID));
    List<Account> list = criteria.list();

ключом является использование crit.list ();

1 голос
/ 02 августа 2011

Согласно документации Hibernate, язык запросов Hibernate должен поддерживать это. (По крайней мере, в версии 3.3)

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-joins

Попробуйте создать свой запрос следующим образом:

Query query = entityManager.createQuery("Select sc from SecurityContact as sc " +
                                        "left outer join sc.agentContact as c " +
                                        "where sc.securityId=:securityId2";

РЕДАКТИРОВАТЬ: изменил свойство контакта sc на свойство agentContact, которое вы указали в деталях вашего вопроса.

0 голосов
/ 18 августа 2014

У меня была похожая проблема.У меня был SiebelUser DAO.Каждый SiebelUser связан с командой со многими отношениями.Некоторые SiebelUser имели userid = 0 в качестве внешнего ключа, для которого первичный ключ не присутствовал в таблице Users.Поэтому, естественно, выборка из таблицы SeibelUsers игнорировала пользователей с идентификатором пользователя = 0.Это была более ранняя конфигурация

<many-to-one name="teamid" class="com.hewitt.wlm.pojo.Tblteams"> <column name="TEAMID" length="4" not-null="true" /> </many-to-one>

Итак, чтобы решить мою проблему, я изменил конфигурацию на.Но у меня это не сработало.

<many-to-one name="teamid" class="com.hewitt.wlm.pojo.Tblteams" **fetch="join" not-null="false" lazy="proxy" not-found="ignore"**> <column name="TEAMID" length="4" not-null="**false**" /> </many-to-one>

Наконец, я изменил свой запрос, чтобы явно сделать левое внешнее соединение, подобное этому, давая заданный путь от SiebelUsers к таблице Users.*

select property1, property2, ...
from from **SiebelUser s left outer join    s.team t**
where property1='x'

Это сработало для меня.

Обратите внимание, что мой класс SiebelUser имел объект Team в качестве своего свойства (как определено в пути выше).Надеюсь, это кому-нибудь поможет.

0 голосов
/ 21 марта 2014

У меня была следующая конфигурация:

<many-to-one column="user_id" lazy="proxy" fetch="join" insert="false" name="user" not-null="true" update="false" not-found="ignore" />

Столбец user_id был не нулевым, но я хотел LEFT OUTER JOIN (вместо INNER JOIN, который я получал), потому что это был просто взлом БД - иногда user_id = 0, который не отображался ни в одну строку в пользовательской таблице (0 в качестве замены NULL). Я не хотел fetch=select режим

После большой отладки в интервалах Hibernate я установил not-null="false", который решил проблему для меня :) (я получил LEFT OUTER JOIN). Надеюсь, кто-то найдет это полезным (кстати: я использую Hibernate 3.6.0.Final).

0 голосов
/ 02 августа 2011

В ваших конфигурациях hibernate установите для свойства use_outer_join значение true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...