복붙노트

[SQL] 최대 절전 모드 기준으로 쿼리 ManyToMany 관계

SQL

최대 절전 모드 기준으로 쿼리 ManyToMany 관계

내가 예를 들어 내 질문을하는 가장 좋은 방법이라고 생각하므로,이 문제를 설명하는 방법을 잘 모르겠어요 :

나는 manyToMany 관계를 가진 두 개의 테이블이 있습니다

운전 면허증 <-> 라이센스 클래스

라이센스 클래스 "자동차", "오토바이"및 "강성 중간"같은 것들이다.

어떻게 모두 "자동차"와 "오토바이"라이센스 수업이있는 모든 라이선스를 볼 수 있습니다, 최대 절전 모드 기준을 사용하십니까?

UPDATE 2008년 12월 11일 나는이 쉽게 사용자 정의의 ResultTransformer를 사용하여 달성 될 수 있다는 것을 발견했다. 그러나 문제는 그 결과 변압기는 쿼리의 결과를 반환 한 후, 실제로 SQL의 일부가되지 않습니다 적용됩니다 있다는 것입니다. 내 문제는 지금 것 같다 "그래서 내가 처음에 SQL 설명 할 수있는 일은 무엇인가? -와 최대 절전 모드 기준 아날로그가"

해결법

  1. ==============================

    1.드디어 HQL을 사용하여 달성하는 방법은 다음과 같습니다

    드디어 HQL을 사용하여 달성하는 방법은 다음과 같습니다

    public List<DriversLicence> findDriversLicencesWith(List<LicenceClass> licenceClasses) {
        String hqlString = "select dl from DriversLicenceImpl dl where 1=1 ";
        for (int i = 0; i < licenceClasses.size(); i++) {
            hqlString += " and :licenceClass" + i + " = some elements(dl.licenceClasses)";
        }
    
        Query query = getSession().createQuery(hqlString);
        for (int i = 0; i < licenceClasses.size(); i++) {
            query.setParameter("licenceClass" + i, licenceClasses.get(i));
        }
        return query.list();
    }
    

    또는 sqlRestriction와 최대 절전 모드 기준을 사용하여 :

    for (LicenceClass licenceClass : licenceClasses) {               
        criteria.add(Restrictions.sqlRestriction("? = some(select " + LicenceClass.PRIMARY_KEY + " from " +
                        LICENCE_CLASS_JOIN_TABLE + "  where {alias}." +
                        DriversLicence.PRIMARY_KEY + " = " + DriversLicence.PRIMARY_KEY + ")",
                        licenceClass.getId(), Hibernate.LONG));
    }
    

    LICENCE_CLASS_JOIN_TABLE 하이버 네이트 driversLicence 및 LicenceClass 사이 대다 관계를 지원하도록 생성하는 테이블의 이름이다.

  2. ==============================

    2.당신은 여전히 ​​관계를 통해 사업에 표기를 점 할 수 있습니다. 예를 들어, 다음 DriversLicence.licenceClass 속성과 LicenceClass.type 속성을 가지고 가정 :

    당신은 여전히 ​​관계를 통해 사업에 표기를 점 할 수 있습니다. 예를 들어, 다음 DriversLicence.licenceClass 속성과 LicenceClass.type 속성을 가지고 가정 :

    session.createCriteria(DriversLicence.class)
       .add(Expression.or(
         Expression.eq("licenceClass.type", "Car"),
         Expression.eq("licenceClass.type", "Motorbike")
       )
    ).list();
    

    이 동적 쿼리 아니기 때문에 개인적으로하지만, 단순히이 경우 기준을 사용하지 않는 것, 대신에 사용

    session.createQuery("from DriversLicence where licenceClass.type in (:types)")
      .setParameterList("types", myListOfTypes)
      .list();
    
  3. ==============================

    3.나는 비슷한 문제가 있었지만, 나는 관련된 모든 기업이 필요로 할 때 그들은 많은 관계로 많은 건초, 클래스 "사용자"에 관한 또한 클래스 "역할"과 관련된 클래스 "기업"이 HQL을 사용하여 고정 특정 사용자에게 나는 다음을 수행;

    나는 비슷한 문제가 있었지만, 나는 관련된 모든 기업이 필요로 할 때 그들은 많은 관계로 많은 건초, 클래스 "사용자"에 관한 또한 클래스 "역할"과 관련된 클래스 "기업"이 HQL을 사용하여 고정 특정 사용자에게 나는 다음을 수행;

    Select e from Enterprise As e inner join e.Users As u inner join u.Roles As r 
    Where u.UserCode=?
    

    나는 당신의 경우에 당신이 뭔가를해야한다고 생각;

    Select dl from LicenceClass As l inner join l.DriversLicences As dl
    Where 
    l.LicenseClass.Name = ? OR 
    l.LicenseClass.Name=? OR 
    l.LicenseClass.Name=?
    

    희망이 도움이.

  4. ==============================

    4.또 다른 옵션은 체인 (한 각 LicenseClass 당에 가입) 조인이다. 나는이 같은 빌더 기준과 조건을 사용

    또 다른 옵션은 체인 (한 각 LicenseClass 당에 가입) 조인이다. 나는이 같은 빌더 기준과 조건을 사용

     List<Predicate> predicates = new ArrayList<>();
     for(Integer lcId : licenceClassIdList) {
         SetJoin<DriversLicence, LicenceClass> dlClasses = dlRoot.join(DriversLicence_.licenceClasses);
         predicates.add(builder.equal(dlClasses.get(LicenseClass_.id), lcId));
     }
     Predicate predicate = builder.and(predicates.toArray(new Predicate[predicates.size()]));
    

    공지 사항 dlRoot는 루트 클래스의 객체이고 당신은 CriteriaQuery 클래스에서 그것을 얻을 수 있습니다. 결과 술어는 당신을 위해 무엇을 찾고 있습니다 ...

  5. ==============================

    5.'나는이 일에 갈 생각하지 않습니다. 나는 '모두 "자동차"와 "오토바이"가 모든 라이센스를 찾으려면

    '나는이 일에 갈 생각하지 않습니다. 나는 '모두 "자동차"와 "오토바이"가 모든 라이센스를 찾으려면

    사용자 Expression.and (....) 대신 Expression.or (....)의 코드에서 닉에 의해 제공

  6. from https://stackoverflow.com/questions/264339/querying-manytomany-relationship-with-hibernate-criteria by cc-by-sa and MIT license