DAO에 유용한 인터페이스 추가

3725 단어 DAO프레임
DAO 기능이 제한된 인터페이스
DAO에는 다음과 같은 인터페이스가 있습니다.
	/**
	 *          ,       .
	 */
	public List<T> findBy(final String propertyName, final Object value) {
		assert StringUtils.isNotBlank(propertyName);
		String jpql = "from " + getEntityClass().getName() + " t where t." + propertyName + "=?";
		return find(jpql, value);
	} 

만약 사용자 상태가 열린 사용자 목록을 찾으려면 이 방법을 사용합니다.
새로운 수요
오늘은 역할과 권한이 일방적으로 관련된다고 가정하고 권한 A를 가진 모든 역할을 찾아야 한다.
이전 솔루션
이전에 우리는 이 기능을 실현하려면 일반적으로 RoleDao에 listByPermissionName과 같은 방법을 써야 했다. 이를 실현하려면 JPQL을 통해 해결할 수 있다.
	/**
	 *              .
	 */
	public List<User> listByPermissionName(final String permissionName) {
		//   ,  join   ,    select  ,          Role  。
		String jpql = "select distinct r from " + Role.class.getName() + " r left join r.permissions p where p.name=?";
		return super.find(jpql, permissionName);
	}
 

편리한 솔루션
현재 우리는 이런 유사한 수요에 많이 부딪혔기 때문에 부류 방법으로 이 문제를 해결할 수 있을까요?그래서 이 두 인터페이스가 생겼다.
	/**
	 *                  ,       .
	 * 
	 * @param propertyName      
	 * @param nestedPropertyName            
	 * @param value    
	 */
	public List<T> findBy(final String propertyName, final String nestedPropertyName, final Object value) {
		assert StringUtils.isNotBlank(propertyName);
		assert StringUtils.isNotBlank(nestedPropertyName);
		String jpql = "select distinct t from " + getEntityClass().getName() + " t left join t." + propertyName
				+ " p where p." + nestedPropertyName + "=?";
		return find(jpql, value);
	}

	/**
	 *                  ,       .
	 * 
	 * @param propertyName      
	 * @param nestedPropertyName            
	 * @param value    
	 */
	public T findUniqueBy(final String propertyName, final String nestedPropertyName, final Object value) {
		assert StringUtils.isNotBlank(propertyName);
		assert StringUtils.isNotBlank(nestedPropertyName);
		String jpql = "select distinct t from " + getEntityClass().getName() + " t left join t." + propertyName
				+ " p where p." + nestedPropertyName + "=?";
		return findUnique(jpql, value);
	}
 

이제 Role Manager에서 IdEntityDao의 이 방법을 사용하면 위의 기능을 그대로 사용할 수 있습니다.
	/**
	 *              .
	 */
	@Transactional(readOnly = true)
	public List<User> listByPermissionName(final String permissionName) {
		return getEntityDao().findBy("permissions", "name", permissionName);
	}
 

메모
 ( 주석 숨기기 )
제공한 방법에는 몇 가지 문제가 있다
  • 그 속성을 얻는 대상은leftjoin 방식을 사용하는데fetch가 필요하면?
  • 그 속성 대상이 지정한 속성 값을 찾았는데 여러 층이 있다면?
     : getEntityDao().findBy("permissions", "creator.name", permissionName); 

  • 우리의dao 기본 코드는 모두 nofetch의 상황만 고려하고 모든 지연 속성을 불러오는 방법은 자신이dao 방법을 다시 써야 한다. 이것은 현재의 모든 구조에서 이렇다.findWithLazyPropertiesBy(StringpropertyName, Objectvalue,String[] fetchedPropertyNames)를 제공할지 여부;의 방법, 논의 필요
  • 이 방법은 확실히 1급 집합 속성의 상황만 고려한다.findByMultiLevelProperty(String multiLevelPropertyName, Objectvalue) 제공을 고려할 수 있습니다.를 사용하는 방법(Role Manager에서): List role = getEntityDao().findBy("permissions.resources.name", "자원 이름");
  • 좋은 웹페이지 즐겨찾기