[SQL] 최대 절전 모드 기준으로 쿼리 ManyToMany 관계
SQL최대 절전 모드 기준으로 쿼리 ManyToMany 관계
내가 예를 들어 내 질문을하는 가장 좋은 방법이라고 생각하므로,이 문제를 설명하는 방법을 잘 모르겠어요 :
나는 manyToMany 관계를 가진 두 개의 테이블이 있습니다
운전 면허증 <-> 라이센스 클래스
라이센스 클래스 "자동차", "오토바이"및 "강성 중간"같은 것들이다.
어떻게 모두 "자동차"와 "오토바이"라이센스 수업이있는 모든 라이선스를 볼 수 있습니다, 최대 절전 모드 기준을 사용하십니까?
UPDATE 2008년 12월 11일 나는이 쉽게 사용자 정의의 ResultTransformer를 사용하여 달성 될 수 있다는 것을 발견했다. 그러나 문제는 그 결과 변압기는 쿼리의 결과를 반환 한 후, 실제로 SQL의 일부가되지 않습니다 적용됩니다 있다는 것입니다. 내 문제는 지금 것 같다 "그래서 내가 처음에 SQL 설명 할 수있는 일은 무엇인가? -와 최대 절전 모드 기준 아날로그가"
해결법
-
==============================
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.당신은 여전히 관계를 통해 사업에 표기를 점 할 수 있습니다. 예를 들어, 다음 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.나는 비슷한 문제가 있었지만, 나는 관련된 모든 기업이 필요로 할 때 그들은 많은 관계로 많은 건초, 클래스 "사용자"에 관한 또한 클래스 "역할"과 관련된 클래스 "기업"이 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.또 다른 옵션은 체인 (한 각 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.'나는이 일에 갈 생각하지 않습니다. 나는 '모두 "자동차"와 "오토바이"가 모든 라이센스를 찾으려면
'나는이 일에 갈 생각하지 않습니다. 나는 '모두 "자동차"와 "오토바이"가 모든 라이센스를 찾으려면
사용자 Expression.and (....) 대신 Expression.or (....)의 코드에서 닉에 의해 제공
from https://stackoverflow.com/questions/264339/querying-manytomany-relationship-with-hibernate-criteria by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL Server 2005의 날짜로 하루를 추가 DateAdd 함수를 사용하여 (0) | 2020.06.29 |
---|---|
[SQL] SQL : 하나 개의 컬럼이 널 (null) 값이 합계 3 열? (0) | 2020.06.29 |
[SQL] 트리거 오류 : 현재 트랜잭션은 커밋 할 수 없습니다 및 운영을 지원하지 수있는 로그 파일에 쓰기 (0) | 2020.06.29 |
[SQL] C #에서 SQL 서버에서 VARBINARY 데이터를 스트리밍 (0) | 2020.06.29 |
[SQL] 그룹화 순서 열 값의 변화에 의해 데이터 그룹 (0) | 2020.06.29 |