Java 如何基于嵌入属性进行排序,并使用规范限制结果的数量?

Java 如何基于嵌入属性进行排序,并使用规范限制结果的数量?,java,hibernate,spring-data,spring-data-jpa,Java,Hibernate,Spring Data,Spring Data Jpa,我试图理解并找出以下用例的解决方案 这些是我的实体类 使用者 用户ID @Embeddable public class UserId implements Serializable { private String userNo; private Long UserType; ....... ....... } 我已经为User、UserID和UserAddress创建了一个staticmetamodel类,并根据规范创建了查询 用户的元模型类 @StaticMeta

我试图理解并找出以下用例的解决方案

这些是我的实体类

使用者

用户ID

@Embeddable
public class UserId implements Serializable {
   private String userNo;
   private Long UserType;
   .......
   .......
}
我已经为User、UserID和UserAddress创建了一个staticmetamodel类,并根据规范创建了查询

用户的元模型类

@StaticMetamodel(User.class)
public abstract class User_ {

  public static volatile SetAttribute<User, UserAddress> addresses;
  public static volatile SingularAttribute<User, UserID> id;
}

问题在于
root.fetch(用户\用户地址)
-在您的
用户
类中,您拥有
地址
而不是
用户地址
,因此您可能错误地为其生成了元模型

另一个地址应该是
listtribute
而不是
SingularAttribute

更新编辑:
尝试使用更新的版本,您描述的问题已在SpringData1.5中解决,我已将我的元模型添加到问题中。我正在使用一个SetAttribute并更正了fetch函数的错误。还是一样的问题。你能在没有排序机制的情况下试一下,看看问题是否也发生了吗?目前,我不知道问题是来自排序还是来自规范。我尝试过不进行排序,但它工作正常。只有在引入排序或分页时,才会出现异常。即使在这种情况下,如果我在嵌入id上而不是在嵌入id内的属性上进行排序,排序也会起作用。Sort sortininstructions=new Sort(Sort.Direction.DESC,“id”);-->这很有效。但理想情况下,它应该在ID中包含一个属性。您使用的是哪个版本的spring数据?我使用的是spring-data-jpa-1.1.0.M1.jar、hibernate-core-4.3.8.Final.jar、hibernate-entitymanager-4.3.8.Final.jar、hibernate-jpa-2.1-api-1.0.0.Final.jar
@Embeddable
public class UserId implements Serializable {
   private String userNo;
   private Long UserType;
   .......
   .......
}
@StaticMetamodel(User.class)
public abstract class User_ {

  public static volatile SetAttribute<User, UserAddress> addresses;
  public static volatile SingularAttribute<User, UserID> id;
}
@StaticMetamodel(UserID.class)
public abstract class UserID_ {
   public static volatile SingularAttribute<UserID, String> userNo;
   public static volatile SingularAttribute<UserID, Long> UserType;
}
public class UserSpecifications {
   public static Specification<User> userNoIs(String userNo) {
      return (root, query, cb) -> {
        root.fetch(User_.addresses);
        return cb.equal(root.get(User_.id).get(UserID_.userNo),userNo);
      };
   }
}
 Sort sortInstructions = new Sort(Sort.Direction.DESC, "id.userNo");
 Specifications<User> specifications = Specifications.where(userNoIs(input.getUserNo()));
 List<User> userList = userRepository.findAll(specifications,sortInstructions);
java.lang.ClassCastException: org.hibernate.jpa.internal.metamodel.SingularAttributeImpl$Identifier cannot be cast to javax.persistence.metamodel.ManagedType
at org.hibernate.jpa.criteria.path.AbstractFromImpl.locateManagedType(AbstractFromImpl.java:139)
at org.hibernate.jpa.criteria.path.AbstractFromImpl.locateAttributeInternal(AbstractFromImpl.java:133)
at org.hibernate.jpa.criteria.path.AbstractPathImpl.locateAttribute(AbstractPathImpl.java:221)
at org.hibernate.jpa.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:194)
at org.springframework.data.jpa.repository.query.QueryUtils.toJpaOrder(QueryUtils.java:287)
at org.springframework.data.jpa.repository.query.QueryUtils.toOrders(QueryUtils.java:261)
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.getQuery(SimpleJpaRepository.java:441)
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:294)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:322)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:307)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)