Java 在HQL NOT in子句中指定列表参数
我有以下代码在HQL查询的Java 在HQL NOT in子句中指定列表参数,java,hibernate,hql,Java,Hibernate,Hql,我有以下代码在HQL查询的NOT in子句中设置List参数 private static final String FIND_AVAILABLE_OPERATORS = "FROM Domain domain WHERE domain.type = :type AND domain.operators NOT IN (:operators)"; @SuppressWarnings("unchecked") @Override public List<Domain> findAva
NOT in
子句中设置List
参数
private static final String FIND_AVAILABLE_OPERATORS = "FROM Domain domain WHERE domain.type = :type AND domain.operators NOT IN (:operators)";
@SuppressWarnings("unchecked")
@Override
public List<Domain> findAvailableOperators(Domain domain) {
Query query = null;
if (domain.getOperators().isEmpty()) {
query = getCurrentSession().createQuery(FIND_BY_DOMAIN_TYPE); // run another query
} else {
query = getCurrentSession().createQuery(FIND_AVAILABLE_OPERATORS);
query.setParameterList("operators", domain.getOperators());
}
query.setParameter("type", DomainType.OPERATOR);
return query.list();
}
我是否正在使用setParameterList()
执行的SQL似乎是
Hibernate: select domain0_.domain_id as domain1_2_, domain0_.country as country2_, domain0_.name as name2_, domain0_.type as type2_ from domain domain0_ cross join domain_operators operators1_, domain domain2_ where domain0_.domain_id=operators1_.parent and operators1_.child=domain2_.domain_id and (. not in (?)) and domain0_.type=?
我从未见过(.不在(?)
编辑:我的域
实体
@Entity
@Table
public class Domain {
@Id
@GenericGenerator(name = "generator", strategy = "increment")
@GeneratedValue(generator = "generator")
@Column(name = "domain_id")
private Long domainId;
@Column(nullable = false, unique = true)
@NotNull
private String name;
@Column(nullable = false)
@NotNull
@Enumerated(EnumType.STRING)
private DomainType type;
@ManyToMany(cascade = {
CascadeType.PERSIST,
CascadeType.MERGE
}, fetch = FetchType.EAGER)
@JoinTable(joinColumns = {
@JoinColumn(name = "domain_id")
}, inverseJoinColumns = {
@JoinColumn(name = "code")
})
private Set<NetworkCode> networkCodes = new HashSet<>();
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(joinColumns = {
@JoinColumn(name = "parent", referencedColumnName = "domain_id")
}, inverseJoinColumns = {
@JoinColumn(name = "child", referencedColumnName = "domain_id")
})
private Set<Domain> operators = new HashSet<>();
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private Country country;
public Domain() {}
... setters/getters
}
@实体
@桌子
公共类域{
@身份证
@GenericGenerator(name=“generator”,strategy=“increment”)
@GeneratedValue(generator=“generator”)
@列(name=“domain\u id”)
私有长域ID;
@列(nullable=false,unique=true)
@NotNull
私有字符串名称;
@列(nullable=false)
@NotNull
@枚举(EnumType.STRING)
私有域类型;
@许多(级联={
cascade type.PERSIST,
级联类型合并
},fetch=FetchType.EAGER)
@JoinTable(JointColumns={
@JoinColumn(name=“domain\u id”)
},反向连接列={
@JoinColumn(name=“code”)
})
私有集networkCodes=新HashSet();
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(JointColumns={
@JoinColumn(name=“parent”,referencedColumnName=“domain\u id”)
},反向连接列={
@JoinColumn(name=“child”,referencedColumnName=“domain\u id”)
})
私有集运算符=新HashSet();
@ManyToOne(可选=false,fetch=FetchType.EAGER)
私人国家;
公共域(){}
…二传手/接球手
}
如中所示,中的[not]谓词仅适用于单值表达式
您必须使用以下查询:
private static final String FIND_AVAILABLE_OPERATORS = "SELECT d FROM Domain as d LEFT OUTER JOIN d.operators as o WHERE d.type = :type AND o.domainID not in (:operators)";
然后,您可以只使用域.getOperators()
ID构建一个列表
,并在setParameterList()方法中使用它
private static final String FIND_AVAILABLE_OPERATORS = "SELECT d FROM Domain as d LEFT OUTER JOIN d.operators as o WHERE d.type = :type AND o.domainID not in (:operators)";